协议缓冲区消息的终结性

本文关键字:缓冲区 消息 协议 | 更新日期: 2024-10-20 00:29:13

背景:

在服务器上运行的C++程序,在协议缓冲文件中输出网络数据。数据包括ip地址和端口。ip和端口保存为文件中的uint32值。C++程序运行在带有英特尔处理器的linux服务器上

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

在读取数据时,我发现ip和端口值的字节顺序是big-endian,在应用程序中使用它之前,我需要反转它。

问题:

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

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

协议缓冲区消息的终结性

如果您使用的是Protocol Buffers库(而不是自己编码),那么您永远不应该真正看到或关心Protobufs本身使用的endianness。库将自动转换为您的本机endianness。因此,如果一个值是向后的,那是因为它最初是向后插入的。

话虽如此,Protobuf编码的端序可以说是小端序,尽管它有点复杂。大多数整数都以"variant"编码,而不是固定宽度编码。从技术上讲,这种编码确实首先编码低阶位,但这不是人们通常认为的"小端整数"。

协议缓冲区消息总是使用小端编码。运行在big-endian体系结构上的实现应该自动进行转换。

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