将uint32_t放入uint8_t数组中

时间:2013-12-10 00:36:40

标签: c++ sockets uint

所以我有以下代码:

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 .....为什么....?

2 个答案:

答案 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。