gpt4 book ai didi

c++ - 没有 ntohs 的字节顺序交换

转载 作者:可可西里 更新时间:2023-11-01 16:28:18 24 4
gpt4 key购买 nike

我正在编写一个 ELF 分析器,但我在正确转换字节顺序时遇到了一些问题。我具有确定分析器的字节序和目标文件的字节序的函数。

基本上,有四种可能的情况:

  1. 在大端目标文件上运行的大端编译分析器
    • 无需转换
  2. 在小端目标文件上运行的大端编译分析器
    • 字节顺序需要交换,但 ntohs/l() 和 htons/l() 在大端机器上都是空宏,所以它们不会交换字节顺序。 这就是问题所在
  3. 在大端目标文件上运行的小端编译分析器
    • 字节顺序需要调换,所以使用htons()调换字节顺序
  4. 在小端目标文件上运行的小端编译分析器。
    • 无需转换

有没有我可以用来显式交换字节顺序/更改字节序的函数,因为 ntohs/l() 和 htons/l() 考虑了主机的字节序,有时不转换?或者我是否需要查找/编写自己的交换字节顺序函数?

最佳答案

我觉得值得养The Byte Order Fallacy此处的文章,作者 Rob Pyke(Go 的作者之一)。

如果您做对了——即您不假设关于您的平台字节顺序的任何事情——那么它就会正常工作。您只需要关心 ELF 格式文件是 Little Endian 还是 Big Endian 模式。

来自文章:

Let's say your data stream has a little-endian-encoded 32-bit integer. Here's how to extract it (assuming unsigned bytes):

i = (data[0]<<0) | (data[1]<<8) | (data[2]<<16) | (data[3]<<24);

If it's big-endian, here's how to extract it:

i = (data[3]<<0) | (data[2]<<8) | (data[1]<<16) | (data[0]<<24);

让编译器去优化它吧。

关于c++ - 没有 ntohs 的字节顺序交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10341477/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com