【问题标题】:Endianness of protocol buffer message协议缓冲区消息的字节序
【发布时间】:2015-03-06 18:29:02
【问题描述】:

背景:

在服务器上运行的 C++ 程序并在协议缓冲区文件中输出网络数据。数据包含 ip 地址和端口等内容。ip 和端口在文件中保存为 uint32 值。 C++ 程序运行在带有 intel 处理器的 linux 服务器上

我有一个 C# 应用程序,它读取这个文件并使用数据进行分析。 C# 应用程序在带有英特尔处理器的 Windows 7 机器上运行。我正在使用 Jon Skeet 的 protobuf-csharp-port 来读取 C# 中的 protobuf。

在读取数据时,我看到 ip 和 port 值的字节顺序是大端,我需要在我的应用程序中使用它之前将其反转。

问题:

即使机器处理器是 intel(我搜索的使用小端格式),协议缓冲区是否以大端格式输出值?

有什么方法可以在将数据保存到文件时强制字节顺序为小端,以便在读取时节省处理?

【问题讨论】:

标签: c# protocol-buffers


【解决方案1】:

如果您使用的是 Protocol Buffers 库(而不是尝试自己对其进行编码),则您永远不应该真正看到或关心 Protobufs 本身使用的字节顺序。该库将自动转换为您的本地字节序。因此,如果一个值向后出现,那是因为它最初是向后插入的。

话虽如此,Protobuf 编码的字节序可以说是小端序,尽管它有点复杂。大多数整数都以“varint”编码进行编码,而不是固定宽度。从技术上讲,这种编码确实首先对低位进行编码,但这并不是人们在说“小端整数”时通常会想到的。

【讨论】:

    【解决方案2】:

    协议缓冲消息总是使用 little-endian 编码。在大端架构上运行的实现应该自动进行转换。

    如果您以错误的顺序接收数据,我建议您使用protoc --decode_raw 来查看错误是发生在发送端还是接收端。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多