【发布时间】:2014-10-27 18:17:40
【问题描述】:
htonl() 或 ntohl() 的许多实现首先测试平台的字节顺序,然后返回一个无操作或字节交换的函数。
我曾经在网上阅读过有关处理大/小端转换的一些技巧的网页,但对硬件配置没有任何先入为主的了解。只考虑字节顺序:内存中整数的表示。但我再也找不到了,所以我写了这个:
typedef union {
uint8_t b[4];
uint32_t i;
} swap32_T;
uint32_t to_big_endian(uint32_t x) {
/* convert to big endian, whatever the endianness of the platform */
swap32_T y;
y.b[0] = (x & 0xFF000000) >> 24;
y.b[1] = (x & 0x00FF0000) >> 16;
y.b[2] = (x & 0x0000FF00) >> 8;
y.b[3] = (x & 0x000000FF);
return y.i;
}
我的两个问题是:
- 您知道编写此
to_big_endian()函数的更简洁的方法吗? - 您是否曾经为这个我找不到的神秘页面添加了书签,其中包含关于字节序的非常宝贵(因为不寻常)的建议?
编辑
不是真正的重复(即使非常接近),主要是因为我确实 不 想要检测字节顺序。相同的代码在两种架构上编译,结果相同
小端序
- 对于
u = 0x12345678(存储为0x78 0x56 0x34 0x12) -
to_big_endian(u) = 0x12345678(存储为0x78 0x56 0x34 0x12)
大端
- 对于
u = 0x12345678(存储为0x12 0x34 0x56 0x78) -
to_big_endian(u) = 0x78563412(存储为0x78 0x56 0x34 0x12)
相同的代码,相同的结果...在内存中。
【问题讨论】:
-
字节序是编译时的事情,而不是运行时的事情 - 只需测试适当的预处理器宏(例如
_BIG_ENDIAN_)并使用它来确定您的函数是否应该是空操作或不是。
标签: c endianness