所以我有以下代码:
uint32_t length = 1;
uint8_t buffer[5];
buffer[0] = htonl(length);
std::cout << (uint32_t)*buffer << std::endl;
std::cout << htonl(length) << std::endl;
倒数第二行打印出 0,最后一行打印出 16777216 .....为什么....?
您实际上并没有将 s 放入uint32_t
数组中uint8_t
。相反,您将其放置在buffer[0]
. 由于长度要大得多,因此只会存储最低的 8 个字节。并且由于您调用htonl(length)
了 ,因此最低的 8 个字节实际上都是 0(至少如果您的主机系统使用与网络不同的字节顺序 - 这里似乎就是这种情况)。
如果你真的想使用 的前四个元素buffer
来存储length
,你必须告诉编译器将它们重新解释为uint32_t
.
uint32_t length = 1;
uint8_t buffer[5];
(uint32_t&)*buffer = htonl(length);
std::cout << (uint32_t)*buffer << std::endl;
std::cout << htonl(length) << std::endl;
不过,这并不是一个好主意。
倒数第二行巧合地打印出零——您从未在buffer
. 您设置buffer[0]
了一个不适合那里的值,其余部分未初始化。
最后一行打印出 16,777,216,因为您的平台是 little-endian 并htonl
切换到 big-endian 格式,所以您的 0,0,0,1 变为 1,0,0,0。这是 256^3 位置的一个,1 * 256^3 = 16,777,216。