【发布时间】:2015-03-30 23:38:36
【问题描述】:
我正在学习 c (Linux) 中的套接字编程,但我真的不明白为什么在发送整数时需要使用 htonl,而在发送字符串 (char*) 时则不需要。我读了很多论文,但我仍然不知道为什么。
【问题讨论】:
-
字符串(通常)以从左到右的一致格式存储,以 \0 结尾。整数(或任何数量的多于一个字节)可以以不同的字节顺序格式存储。因此,当你读或写一个数字时,它就被操纵了。
我正在学习 c (Linux) 中的套接字编程,但我真的不明白为什么在发送整数时需要使用 htonl,而在发送字符串 (char*) 时则不需要。我读了很多论文,但我仍然不知道为什么。
【问题讨论】:
这是因为通过网络发送的数据是按照 Big Endian 顺序发送的。不同的平台以不同的顺序存储数据。
假设您有一个 0x9FD3 的 short。在 Small Endian 平台上,它将作为 0xD39F 存储在内存中。第一个字节是 0xD3,下一个字节是 0x9F。如果您将其发送到默认使用 Big Endian 的机器,它将被解释为 0xD39F (54,1475),而不是 0x9FD3 (40,915)。另一方面,字符串被保存为字符数组,这是为了开始。如果您有“aString”,它将在内存中存储为“a”、“S”、“t”、“r”……因为 1 个字符是 1 个字节宽。在小端平台上只会倒序存储多字节的数据类型,转换毫无意义
【讨论】: