我正在尝试将 an 转换uint_64_t为网络字节顺序,为了做到这一点,我将其分成uint_64_t两部分uint_32_t以便使用htonl,因为它只能与 一起使用uint_32_t。我按以下方式拆分它:
uint32_t partA = (uint32_t) (x);
uint32_t partB = (uint32_t) (x >> 32);
Run Code Online (Sandbox Code Playgroud)
例如,当我输入 时x=1,我正确地得到partA=1, partB=0,这非常有道理:
1->[00000000000000000000000000000000][00000000000000000000000000000001]
现在,我决定将 ntohl 应用于每个单独的部分,如下所示:
uint32_t partA = htonl((uint32_t) (x));
uint32_t partB = htonl((uint32_t) (x >> 32)));
Run Code Online (Sandbox Code Playgroud)
我希望partA应该包含相反的位(大端),所以它应该保存值10000000000000000000000000000000(32b),但相反,该值是1000000000000000000000000(25b),比应有的短7b。
字节顺序适用于字节,而不是位。
10x01 0x00 0x00 0x00以字节(小端)或0x00 0x00 0x00 0x01(大端)表示。
用位表示,它们是00000001 00000000 00000000 00000000和00000000 00000000 00000000 00000001。
前者00000001 00000000 00000000 00000000有 7 个尾随零,因此删除这些零会导致结果缩短 7 位。