-2

所以我有以下代码:

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

4

2 回答 2

3

您实际上并没有将 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;

不过,这并不是一个好主意。

于 2013-12-10T00:46:42.010 回答
-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。

于 2013-12-10T00:42:13.073 回答