【问题标题】:Network Byte Order in sockets套接字中的网络字节顺序
【发布时间】:2015-03-30 23:38:36
【问题描述】:

我正在学习 c (Linux) 中的套接字编程,但我真的不明白为什么在发送整数时需要使用 htonl,而在发送字符串 (char*) 时则不需要。我读了很多论文,但我仍然不知道为什么。

【问题讨论】:

  • 字符串(通常)以从左到右的一致格式存储,以 \0 结尾。整数(或任何数量的多于一个字节)可以以不同的字节顺序格式存储。因此,当你读或写一个数字时,它就被操纵了。

标签: c sockets integer send


【解决方案1】:

这是因为通过网络发送的数据是按照 Big Endian 顺序发送的。不同的平台以不同的顺序存储数据。

假设您有一个 0x9FD3 的 short。在 Small Endian 平台上,它将作为 0xD39F 存储在内存中。第一个字节是 0xD3,下一个字节是 0x9F。如果您将其发送到默认使用 Big Endian 的机器,它将被解释为 0xD39F (54,1475),而不是 0x9FD3 (40,915)。另一方面,字符串被保存为字符数组,这是为了开始。如果您有“aString”,它将在内存中存储为“a”、“S”、“t”、“r”……因为 1 个字符是 1 个字节宽。在小端平台上只会倒序存储多字节的数据类型,转换毫无意义

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 2011-09-25
    • 2013-03-18
    • 2020-02-02
    • 1970-01-01
    • 2013-06-28
    相关资源
    最近更新 更多