协议缓冲区消息的字节顺序
Endianness of protocol buffer message
背景:
服务器上的 C++ 程序 运行 并在协议缓冲区文件中输出网络数据。数据包含 ip 地址和 ports.The ip 和端口在文件中保存为 uint32 值。 C++ 程序 运行 在具有英特尔处理器
的 linux 服务器上运行
我有一个 C# 应用程序读取此文件并使用数据进行分析。 C# 应用程序 运行s 在带有英特尔处理器的 windows 7 机器上。我正在使用 Jon Skeet 的 protobuf-csharp-port 在 C# 中读取 protobuf。
在读取数据时,我看到 ip 和 port 值的字节顺序是 big endian,我需要将其反转才能在我的应用程序中使用它。
问题:
即使机器处理器是 intel(根据我搜索的使用小端格式),协议缓冲区是否以大端格式输出值?
有什么办法可以在将数据保存到文件时强制字节顺序为小端序,以便在读取时节省处理时间?
协议缓冲区消息始终使用小端编码。大端架构上的实现 运行 应该会自动进行转换。
如果你接收数据的顺序不对,我建议使用protoc --decode_raw
查看错误是在传输端还是在接收端。
如果您使用的是 Protocol Buffers 库(不是尝试自己对其进行编码),那么您永远不应该真正看到或关心 Protobufs 本身使用的字节顺序。该库将自动转换为您的本地字节序。因此,如果一个值向后输出,那是因为它首先被向后插入。
这么说来,Protobuf编码的字节顺序可以说是little-endian,虽然稍微复杂一些。大多数整数以 "varint" 编码编码,而不是固定宽度。从技术上讲,这种编码确实首先编码低阶位,但这并不是人们在说 "little-endian integer".
时通常想到的。
背景:
服务器上的 C++ 程序 运行 并在协议缓冲区文件中输出网络数据。数据包含 ip 地址和 ports.The ip 和端口在文件中保存为 uint32 值。 C++ 程序 运行 在具有英特尔处理器
的 linux 服务器上运行我有一个 C# 应用程序读取此文件并使用数据进行分析。 C# 应用程序 运行s 在带有英特尔处理器的 windows 7 机器上。我正在使用 Jon Skeet 的 protobuf-csharp-port 在 C# 中读取 protobuf。
在读取数据时,我看到 ip 和 port 值的字节顺序是 big endian,我需要将其反转才能在我的应用程序中使用它。
问题:
即使机器处理器是 intel(根据我搜索的使用小端格式),协议缓冲区是否以大端格式输出值?
有什么办法可以在将数据保存到文件时强制字节顺序为小端序,以便在读取时节省处理时间?
协议缓冲区消息始终使用小端编码。大端架构上的实现 运行 应该会自动进行转换。
如果你接收数据的顺序不对,我建议使用protoc --decode_raw
查看错误是在传输端还是在接收端。
如果您使用的是 Protocol Buffers 库(不是尝试自己对其进行编码),那么您永远不应该真正看到或关心 Protobufs 本身使用的字节顺序。该库将自动转换为您的本地字节序。因此,如果一个值向后输出,那是因为它首先被向后插入。
这么说来,Protobuf编码的字节顺序可以说是little-endian,虽然稍微复杂一些。大多数整数以 "varint" 编码编码,而不是固定宽度。从技术上讲,这种编码确实首先编码低阶位,但这并不是人们在说 "little-endian integer".
时通常想到的。