C# 协议缓冲区消息的终止性 背景: 一个C++程序,运行在服务器上,并在协议缓冲文件中输出网络数据。数据包含ip地址和端口等内容。ip和端口保存为文件中的uint32值。C++程序运行在Linux服务器上,英特尔处理器

C# 协议缓冲区消息的终止性 背景: 一个C++程序,运行在服务器上,并在协议缓冲文件中输出网络数据。数据包含ip地址和端口等内容。ip和端口保存为文件中的uint32值。C++程序运行在Linux服务器上,英特尔处理器,c#,protocol-buffers,C#,Protocol Buffers,我有一个C#应用程序,它读取这个文件并使用数据进行分析。C#应用程序在装有英特尔处理器的Windows7机器上运行。我正在使用Jon Skeet的protobuf csharp端口读取C#中的protobuf 在读取数据时,我看到ip和端口值的字节顺序是big-endian,在我的应用程序中使用它之前,我需要反转它 问题: 协议缓冲区是否以大端格式输出值,即使机器处理器是intel(我搜索的是使用小端格式的intel) 在将数据保存到文件时,是否有任何方法可以强制字节顺序为little endi

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

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

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


在将数据保存到文件时,是否有任何方法可以强制字节顺序为little endian,以便在读取数据时保存处理?

协议缓冲区消息始终使用little endian编码。在big-endian架构上运行的实现应该自动进行转换


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

如果您使用的是协议缓冲区库(而不是自己尝试编码),您永远不应该实际看到或关心Protobufs本身使用的尾端。该库将自动转换为您的本机endianness。因此,如果一个值是向后输出的,那是因为它首先是向后插入的

话虽如此,Protobuf编码的endianness可以说是小endians,尽管它有点复杂。大多数整数采用“可变”编码,而不是固定宽度。从技术上讲,这种编码确实首先对低阶位进行编码,但这不是人们通常在说“小端整数”时想到的。因此,它很可能总是以大端整数传输数据。