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

时间:2011-12-07 08:28:31

标签: c# c++ serialization protocol-buffers

这似乎是一个基本问题,但我怀疑可能是因为我使用2个不同的库来编写和读取数据。我的Write程序是用c ++编写的,它使用谷歌的协议缓冲库。我的读者是用.NET c#实现的。

在写程序中,我按如下方式编写文件头。

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#中读取上述字段的相应功能是什么?我理解如何读取协议缓冲区消息,但不知道如何读取上述数据。

此致 阿洛克

1 个答案:

答案 0 :(得分:1)

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

int x, int y; // ignore
int value = ProtoReader.ReadLengthPrefix(stream, false, PrefixStyle.Fixed32,
                      out x, out y);

假设编码流使用标准的protobuf约定,字符串将写为varint长度前缀,然后写入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