【问题标题】:Is asn.1 code endianess independent?asn.1 代码字节序是否独立?
【发布时间】:2013-12-20 07:58:50
【问题描述】:
我有两个软件模块,一个在 PowerPC 上运行,另一个在 x86 机器上运行。这两个模块使用 ASN.1 生成的函数进行通信。 PowerPC 是大端,x86 是小端。我没有从 x86 到 PowerPC 获得预期的数据。使用 asn.1 时字节序是否会成为问题?
【问题讨论】:
-
-
在接收和发送 ASN.1 blob 时使用一些第 3 方 ASN.1 解析器/查看器来解码它。我喜欢使用lapo.it/asn1js 快速查看。
标签:
endianness
asn.1
powerpc
【解决方案2】:
由 ASN.1 的编码规则(BER、PER 等)在线路上产生的位不依赖于对数据进行编码的计算机的字节序。
【解决方案3】:
这两个模块使用 ASN.1 生成的函数进行通信。 [...] 使用 ASN.1 时字节序是否会成为问题?
让我们分解一下。这个问题有3个层次。
ASN.1 表示法和相关规范用于“抽象”语法表示法。它不关心值的编码方式。
值的编码(由 ASN.1 模式描述)由 ASN.1“编码”方案处理;例如BER、CER、DER、PER 等。 (Wikipedia 列出了 11 种不同的方案。)要了解特定方案是否对“字节序”敏感,您需要查看相应的规范1。
如果您使用生成的函数对 ASN.1 进行编码和解码,那么这里将处理字节序敏感性问题。这实际上取决于供应商如何实现生成器,以及生成的代码是做什么的。
因此,要针对您的具体情况获得明确的答案,您需要找出您使用的编码(BER、PER 等),然后阅读供应商文档。但是,我期望一个高质量的 ASN.1 生成器会生成一些函数,这些函数可以在应用程序中隐藏 ASN.1 编码中的任何字节顺序问题。
确定这是否是问题根源的另一种方法是编写一个简单的测试。设计一个简单的 ASN.1 架构,生成函数,部署到您的两个(或更多)平台,看看您是否可以传递简单的整数。
1 - 根据我对 BER 规范的阅读,BER 使用与发送方或接收方字节序无关的整数编码。您可以通过维基百科页面中的“外部参考”链接找到规范。
【解决方案4】:
为什么不调试收到的数据并与原始数据进行比较?难道不是比在这里提问更容易和更快吗?一个断点就够了
一般而言,任何存储到内存中或在计算机之间传输的多字节数据都必须遵循特定的字节序,或者您必须在流中包含字节序信息并在接收器中根据需要反转数据