【问题标题】:ARM and x86, is necessary deal with Hardware Architecture compatibility in my situation?ARM和x86,在我的情况下是否有必要处理硬件架构兼容性?
【发布时间】:2020-06-26 16:38:39
【问题描述】:

我有一个 coap 服务器代码在我的网关上运行,它可能具有 x86 或 ARM 架构,它将缓冲区发送到另一个可能具有 x86 或 ARM 架构的硬件中的 coap 客户端,我的问题是,在客户端的特定场景中x86架构,服务端ARM架构,当服务端写入buffer,客户端解析payload buffer时会出现不兼容,从而报错?

obs:我问这个是因为 x86 架构是 little-endian,而 ARM 架构是 Big-endian。

【问题讨论】:

  • arm 是原生小端。你必须付出额外的努力才能让它变大

标签: node.js x86 arm endianness coap


【解决方案1】:

要在可能具有不同架构的系统之间交换原始二进制数据,必须将数据放入已知的规范格式。发件人必须确保它采用该已知格式,而收件人必须期望它采用该已知格式。

对于一些简单的事情。如果它只是一个 U8 值数组(无符号 8 位值),那么这已经是一种已知的规范格式。

但是,如果它是 U16、U32、U64、S16、S32、S64 值的数组或包含这些较大值的任何类型的格式,那么您必须知道它是大端还是小端字节格式。您需要确定交换格式是什么,并确保在发送之前将数据转换为该格式,并且接收方需要接受该格式的数据,也许将其转换为它想要在本机使用的格式。

因此,您不能盲目地将多字节数据从小端架构发送到大端架构而不进行转换。最好确定一种特定的交换格式,让数据的发送者确保将数据转换为该交换格式,并确保接收者期待该交换格式的数据。

仅供参考,对于少量数据,这就是为什么非二进制格式(如 JSON)存在并变得如此流行的原因,因为它们已经是一个不存在字节序问题的众所周知的标准。

【讨论】:

    【解决方案2】:

    CoAP 协议适用于任何字节序的机器。

    CoAP 不会对请求/响应负载中传输的数据进行任何转换,但与 CoAP 本身一样,其中的常用格式已明确指定。

    【讨论】:

    • 好吧,CoAP 协议指定您在协议本身中以网络字节顺序发送内容。它没有指定有关数据有效负载的任何内容。这取决于发件人,这就是我认为 OP 在这个问题中要问的问题。
    • 好点 - 不能拒绝我自己的答案,但提升了你的答案,我确实错过了关于有效负载缓冲区的要点。
    • @jfriend00 关于我的问题是正确的,我唯一关心的是不同的 arquictetures 将如何处理有效负载。
    【解决方案3】:

    大多数现代 ARM CPU 都是 little-endian,与 x86 相同。 (https://en.wikipedia.org/wiki/Endianness)。一些 ARM CPU 可以在任一模式(双端)下运行,但通常以小端模式运行。

    这与 CoAP apparently 为其协议标头指定的“网络字节顺序”相反,但如果您愿意,您可以将自己的原始有效负载数据作为 little-endian 发送。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-31
      • 1970-01-01
      • 2014-08-26
      相关资源
      最近更新 更多