将 uint_32_t 转换为网络字节顺序会导致位长度比预期短

QUI*_*PPY 1 c

我正在尝试将 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。

Mik*_*CAT 6

字节顺序适用于字节,而不是位。

10x01 0x00 0x00 0x00以字节(小端)或0x00 0x00 0x00 0x01(大端)表示。

用位表示,它们是00000001 00000000 00000000 0000000000000000 00000000 00000000 00000001

前者00000001 00000000 00000000 00000000有 7 个尾随零,因此删除这些零会导致结果缩短 7 位。