所以我有以下代码:
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 .....为什么....?
答案 0 :(得分:3)
您实际上并没有将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;
虽然这不是一个好主意。
答案 1 :(得分:-1)
倒数第二行巧合地打印出零 - 你从未在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。