回答(11)
2 years ago
OP的示例代码不正确 .
字节序转换在位和8位字节级工作 . 大多数字节序问题涉及字节级别 . OP代码在4位半字节级别进行字节序更改 . 推荐:
// Swap endian (big to little) or (little to big)
uint32_t num = 9;
uint32_t b0,b1,b2,b3;
uint32_t res;
b0 = (num & 0x000000ff) << 24u;
b1 = (num & 0x0000ff00) << 8u;
b2 = (num & 0x00ff0000) >> 8u;
b3 = (num & 0xff000000) >> 24u;
res = b0 | b1 | b2 | b3;
printf("%" PRIX32 "\n", res);
如果性能真的很重要,则需要知道特定的处理器 . 否则,将其留给编译器 .
[编辑] OP添加了一条改变事情的评论 .
"32bit numerical value represented by the hexadecimal representation (st uv wx yz) shall be recorded in a four-byte field as (st uv wx yz)."
在这种情况下,32位数字的字节序是未知的,结果需要以小端顺序存储在内存中 .
uint32_t num = 9;
uint8_t b[4];
b[0] = (uint8_t) (num >> 0u);
b[1] = (uint8_t) (num >> 8u);
b[2] = (uint8_t) (num >> 16u);
b[3] = (uint8_t) (num >> 24u);
[2016年编辑]简化
...结果的类型是提升的左操作数的类型....按位移位运算符C11§6.5.73
在移位常数(右操作数)之后使用 u 导致与没有它的情况相同 .
b3 = (num & 0xff000000) >> 24u;
b[3] = (uint8_t) (num >> 24u);
// same as
b3 = (num & 0xff000000) >> 24;
b[3] = (uint8_t) (num >> 24);
2 years ago
我想你可以使用函数 htonl() . 网络字节顺序是大端 .