C ++程序在服务器上运行,并在协议缓冲区文件中输出网络数据。数据包含IP地址和端口等.ip和端口在文件中保存为uint32值。 C ++程序在带有intel处理器的linux服务器上运行
我有一个C#应用程序,它读取此文件并使用数据进行分析。 C#应用程序在带有intel处理器的Windows 7机器上运行。我正在使用Jon Skeet的protobuf-csharp-port来读取C#中的protobuf。
在读取数据时,我看到ip和port值的字节顺序是大端,我需要在我的应用程序中使用它之前将其反转。
即使机器处理器是intel(我搜索的是使用小端格式),协议缓冲输出大端格式的输出值吗?
在将数据保存到文件时是否有任何方法可以强制字节顺序为小端,以便在读取时节省处理?
答案 0 :(得分:8)
如果您正在使用Protocol Buffers库(而不是尝试自己编码),那么您永远不应该真正看到或关心Protobufs本身使用的字节序。库将自动转换为您的本机字节序。因此,如果一个值向后出现,那是因为它首先被向后插入。
话虽如此,Protobuf编码的字节顺序可以说是小端,虽然它有点复杂。大多数整数都用" varint"编码。编码,而不是固定宽度。从技术上讲,这种编码首先对低位进行编码,但它并不是人们通常会想到的那样,当他们说" little-endian integer"。
答案 1 :(得分:1)
协议缓冲区消息始终使用little-endian编码。在big-endian架构上运行的实现应该自动进行转换。
如果您收到错误顺序的数据,我建议您使用protoc --decode_raw
查看错误是在发送方还是接收方发生。