【问题标题】:Is byte ordering the same across iOS devices, and does this make using htonl and ntohl unnecessary between iOS devices?iOS 设备之间的字节顺序是否相同,这是否使得在 iOS 设备之间使用 htonl 和 ntohl 是不必要的?
【发布时间】:2013-11-21 07:22:20
【问题描述】:

我正在阅读此example,了解如何将 NSData 用于网络消息。

在创建 NSData 时,示例使用:

unsigned int state = htonl(_state);
[data appendBytes:&state length:sizeof(state)];

将 NSData 转换回来时,示例使用:

  [data getBytes:buffer range:NSMakeRange(offset, sizeof(unsigned int))];
  _state = ntohl((unsigned int)buffer);

这个例子中是不是不用htonl和ntohl? - 由于数据是在 iOS 设备上打包/解包的,字节顺序不会相同,因此不需要使用 htonl 和 ntohl。 - 是不是使用方式不对?示例使用htonl打包,ntohl解包。但实际上,不应该只在知道发送方或接收方使用特定格式的情况下才这样做吗?

【问题讨论】:

    标签: ios objective-c macos intel htonl


    【解决方案1】:

    该示例使用 htonl 进行打包,使用 ntohl 进行解包。

    这是正确的。

    当发送者通过网络传输数据(整数、浮点数)时,它应该将它们重新排序为“网络字节顺序”。接收端通过从网络字节顺序重新排序为“主机字节顺序”来执行解码。

    但实际上,不应该只在知道发送者或接收者使用特定格式的情况下才这样做吗?

    通常,发送者不知道接收者的字节顺序,反之亦然。因此,为了避免歧义,需要定义“网络”的字节顺序。如果发送者和接收者确实为网络正确编码/解码,这很好用。

    编辑:

    如果您担心编码的性能:

    在现代 CPU 上,字节交换所需的机器代码非常快。

    在语言级别上,编码和解码一系列字节的函数也可以非常快。不过,我们帖子中的 Objective-C 示例不属于那些“快速”的例程。

    例如,由于主机字节顺序在编译时是已知的,如果主机字节顺序等于网络字节顺序,ntohl 将成为一个“空”函数(又名“NoOp”)。

    其他字节交换实用程序函数在 ntoh 系列宏上扩展为 64 位、双精度和浮点值,可以利用 C++ 模板技巧,这些技巧也可能成为“NoOp”函数。

    这些“空”函数可以进一步完全优化掉,这有效地导致机器代码只执行从源缓冲区到目标缓冲区的move

    但是,由于字节交换的额外开销非常小,因此这些在不需要交换的情况下的优化只能在高性能代码中感知。但你的第一句话:

    [data getBytes:buffer range:NSMakeRange(offset, sizeof(unsigned int))];
    

    比下面的语句贵很多

    _state = ntohl((unsigned int)buffer);
    

    即使需要字节交换。

    【讨论】:

    • 备注:在我见过的所有 big-endian 平台上,ntohl 被定义为#define ntohl(x) (x),所以即使没有 C++ 模板,它也变成了“无操作”:-)
    • 在这种情况下,如果知道发送方和接收方都是iOS,我们可以去掉htonl和ntohl吗?
    • @MartinR 你是对的 ;) - 澄清了我真正想说的话。
    • @John 字节顺序取决于硬件,而不是操作系统(大多数情况下,因为可以配置 ARM 硬件)。 AFAIK,所有带有 iOS 的设备都具有相同的字节顺序(可能未来的设备也将具有相同的字节顺序)。也就是说,你可以 - 但你不应该在未来获得更好的兼容性。
    • 所以我想外卖/最佳实践是,必须始终假设通过网络发送/要发送的数据是按网络字节顺序排列的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多