实际应用中的Endian相关代码?

时间:2011-03-29 02:22:07

标签: c endianness

我知道以下C代码依赖于字节序:

short s_endian = 0x4142;
char c_endian = *(char *)&s_endian;

在大端机器上,c_endian将为'A'(0x41);而在小端机器上,它将是'B'(0x42)。

但是这段代码看起来很难看。在实际应用程序中是否存在字节序依赖代码?或者您是否遇到过使用不同端序移植到不同目标时需要进行大量更改的任何应用程序?

感谢。

6 个答案:

答案 0 :(得分:2)

几乎所有处理以二进制格式保存超过8位整数的代码,或通过网络发送此类整数的代码。对于一个非常常见的示例,the TCP header中的许多字段属于此类别。

答案 1 :(得分:1)

网络代码依赖于端点(它应该始终作为big-endian在网络上传输,即使在小端机器上),因此需要htons()htonl(),{{ 1}}和ntohs() ntohl()允许从主机到网络的字节顺序和网络到主机字节顺序轻松转换。

希望这有帮助,

杰森

答案 2 :(得分:0)

我曾经在PC上使用专门的DAQ卡收集数据,并尝试在PowerPC mac上分析文件。原来使用的“文件格式”是原始内存转储...

x86上的小端,Power PC上的大端。你搞清楚了。

答案 3 :(得分:0)

简短的回答是肯定的。任何将原始二进制文件读/写到文件或套接字的内容都需要跟踪数据的字节顺序。

例如,the IP protocol requires big-endian representation.

答案 4 :(得分:0)

在操作浮点数的内部表示时,可以使用整数类型访问部分(或完整值)。例如:

union float_u
{
  float f;
  unsigned short v[2];
};

int get_sign(float f)
{
  union float_u u;
  u.f = f;
  return (u.v[0] & 0x8000) != 0;     // Endian-dependant
}

答案 5 :(得分:0)

如果您的程序将数据发送到另一个系统(通过串行或网络链接,或通过将其保存到文件中以供其他人阅读)或从另一个系统读取数据,那么您可能会遇到字节序问题。

我不知道静态分析能够检测到这样的构造,但是让程序员遵循编码标准,其中标记了结构元素和变量以表明它们的字节顺序可以提供帮助。

例如,如果所有网络数据结构都将_be附加到命名的多字节成员,则可以查找分配了非后缀(主机字节顺序)变量或甚至是文字值的实例(如0x1234)给其中一个成员。

如果我们能够捕获数据类型中的字节序 - uint32_be和uint32_le与uint32_t一起使用会很棒。然后编译器可以禁止两者之间的分配或操作。 htobe32的签名为uint32_be htobe32( uint32_t n);