【问题标题】:How do I put a single byte into network byte order?如何将单个字节放入网络字节顺序?
【发布时间】:2014-10-21 06:16:35
【问题描述】:

所以我有变量:

uint8_t version = 1;
uint8_t ttl = 1;
uint16_t payload_length = 
uint32_t account_identifier = 24027;
uint32_t source_address = 0;
uint32_t destination_address = 0;
uint16_t checksum = 0;
uint16_t protocol = 1;

我想按网络字节顺序排列所有值。

我知道将 htons() 用于 16 位值,将 htonl() 用于 32 位值。

所以我会这样做:uint32_t source_address = htonl(0);uint16_t checksum = htons(0);

我应该为 8 位值使用什么?

【问题讨论】:

    标签: c network-programming byte network-protocols bits


    【解决方案1】:

    8 位值应该使用什么?

    什么都没有。 1 字节(8 位)值没有“字节顺序”。所以你不必担心它们(这就是为什么没有hton 函数)。

    【讨论】:

    • 字节中的位字节序如何,它将是 MSB0 还是 LSB0。请注意,bigendian 系统具有两种表示形式
    • @bare_metal:您无法处理代码中的单个位。 Bit endianness 通常仅适用于通过串行介质进行的物理传输,在这些情况下,由协议和硬件本身(即 802.3 和 802.11)直接处理。就 C 代码而言,没有位字节序,因为您无法寻址单个位。字节顺序是字节如何打包和寻址的问题。如果你不能解决它,它就没有字节序。由于您无法寻址位,因此实际上没有位级字节序。
    • 让我们假设我们将一个字节从一个大端机器传输到另一个大端机器,并考虑一个具有 MSB0 位表示,另一个具有 LSB0 位表示如何处理? (en.wikipedia.org/wiki/Bit_numbering)。并且 RFC 推荐的样式是 MSB0
    • @bare_metal:在协议中处理。例如,查看802.3 (Ethernet) frame。它以 八位字节 的集合定义。 In the Ethernet protocol, the bytes are arranged in big-endian order, but the octet bits are little-endian。所以两台计算机在传输数据时,它们的网卡必须按照协议要求的顺序排列比特。网络硬件会为您处理这种位级字节序,因此您的代码和 CPU 不必担心它。
    【解决方案2】:

    8 位值只有一个字节,因此它们的字节顺序并不重要——它们是相同的。所以什么都不用:)。

    【讨论】:

    • 啊,好吧,我明白了,现在说得通了。感谢大家的回复!
    【解决方案3】:

    我应该为 8 位值使用什么。

    什么都没有。你不能按顺序排列一个字节。

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 2014-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多