C# 如何使用protobuf net读取fixed32整数?

C# 如何使用protobuf net读取fixed32整数?,c#,c++,serialization,protocol-buffers,C#,C++,Serialization,Protocol Buffers,这似乎是一个基本问题,但我有疑问,可能是因为我使用了两个不同的库来编写和读取数据。我写的程序是用C++编写的,它使用谷歌的协议缓冲库。我的阅读器是用.NETC#实现的 在write程序中,我编写了一个文件头,如下所示 coded_output->WriteLittleEndian32(BIN_START_MAGIC_NUMBER); coded_output->WriteLittleEndian32(major_version); coded_output->WriteLitt

这似乎是一个基本问题,但我有疑问,可能是因为我使用了两个不同的库来编写和读取数据。我写的程序是用C++编写的,它使用谷歌的协议缓冲库。我的阅读器是用.NETC#实现的

在write程序中,我编写了一个文件头,如下所示

coded_output->WriteLittleEndian32(BIN_START_MAGIC_NUMBER);
coded_output->WriteLittleEndian32(major_version);
coded_output->WriteLittleEndian32(minor_version);
coded_output->WriteVarint32(strlen(_region));
coded_output->WriteRaw(_region, strlen(_region));
coded_output->WriteLittleEndian32(_offset);
C#中读取上述字段的对应函数是什么?我了解如何读取协议缓冲区消息,但不确定如何读取上述数据

问候,,
Alok

文件头不是有效的protobuf序列,因此protobuf网络中的标准读取机制不会适合读取它-事实上,
ProtoReader
不会让自己进入读取该序列的状态,因为它是无效的。然而!要读取一个小的endian 32位数字,您可能可以使用:

int x, int y; // ignore
int value = ProtoReader.ReadLengthPrefix(stream, false, PrefixStyle.Fixed32,
                      out x, out y);
假设编码流使用标准protobuf约定,字符串将被写入可变长度前缀,然后写入UTF-8,因此您可以使用:

int x, int y; // ignore
int length = ProtoReader.ReadLengthPrefix(stream, false, PrefixStyle.Base128,
                      out x, out y);
byte[] bytes = new byte[length];
int read, offset = 0;
while(length > 0 && (read = stream.Read(bytes, offset, length)) > 0) {
    offset += read;
    length = read;
}
if(length > 0) throw new EndOfStreamException();
string s = Encoding.UTF8.GetString(bytes);

如果你真的想要的话,我可能可以为你更方便地打包这些东西;他们目前没有暴露,因为那不是protobuf;p

文件头不是有效的protobuf序列,因此protobuf网络中的标准读取机制不适合读取它-事实上,
ProtoReader
不会让自己进入读取状态,因为它是无效的。然而!要读取一个小的endian 32位数字,您可能可以使用:

int x, int y; // ignore
int value = ProtoReader.ReadLengthPrefix(stream, false, PrefixStyle.Fixed32,
                      out x, out y);
假设编码流使用标准protobuf约定,字符串将被写入可变长度前缀,然后写入UTF-8,因此您可以使用:

int x, int y; // ignore
int length = ProtoReader.ReadLengthPrefix(stream, false, PrefixStyle.Base128,
                      out x, out y);
byte[] bytes = new byte[length];
int read, offset = 0;
while(length > 0 && (read = stream.Read(bytes, offset, length)) > 0) {
    offset += read;
    length = read;
}
if(length > 0) throw new EndOfStreamException();
string s = Encoding.UTF8.GetString(bytes);


如果你真的想要的话,我可能可以为你更方便地打包这些东西;他们目前没有暴露,因为那不是protobuf;p

分配文件时,您也会将这些文件写入文件流,然后在其中使用,您可以指定要读取的内容,例如WriteElitleEndian32是32bits@nikolaMM94虽然读取4个字节非常简单(尽管实际上这并不像调用Read passing count=4那么简单),但字符串显然更复杂,因为您还需要处理变量编码。我支持我将能够读取小尾端的32位整数。那么Varint32整数呢。我猜这将是一个编码的文件,无法直接通过FileStream读取。C#?@Marc中是否有相应的读取函数,这正是我关于字符串的问题。你能告诉我在哪里可以找到这方面的文档吗?@Marc,现在检查你的回复。将这些文件分配给文件流,然后在那里使用你可以指定要读取的内容,例如WriteElitleEndian32是32bits@nikolaMM94读取4个字节非常简单(尽管这实际上并不像调用Read passing count=4那么简单),字符串明显更复杂,因为您还需要处理varint编码。我支持我将能够读取小endian 32位整数。Varint32整数呢。我猜这将是一个编码的字符串,无法通过FileStream直接读取。C#中是否有相应的读取函数?@Marc,这正是我关于字符串。你能告诉我在哪里可以找到这方面的文档吗?@Marc,现在检查你的答复。WriteVarint32()是否指定字符串的大小?@nikolaMM94 WriteVarint32映射到带Base128的ReadLengthPrefix(我真的必须将其重命名为varint…)谢谢你的回复。效果很好。我可以使用提供的解决方案。我知道这不是一个有效的protobuf序列,但我认为许多开发人员会使用此代码,因此可能更容易将其打包为函数。要读取具有给定长度前缀的字符串?@Alok如我上面的第二个示例所示。如果你的意思是“您能添加更方便的方法吗”…可能,是的;pdoes WriteVarint32()指定字符串的大小?@nikolaMM94 WriteVarint32映射到具有Base128的ReadLength前缀(我真的必须将其重命名为varint…)谢谢你的回复。效果很好。我可以使用提供的解决方案。我知道这不是一个有效的protobuf序列,但我认为许多开发人员会使用此代码,因此可能更容易将其打包为函数。要读取具有给定长度前缀的字符串?@Alok如我上面的第二个示例所示。如果你的意思是“您是否可以添加方法来更方便地执行此操作“…可能,是的;p