这似乎是一个基本问题,但我怀疑可能是因为我使用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#中读取上述字段的相应功能是什么?我理解如何读取协议缓冲区消息,但不知道如何读取上述数据。
此致 阿洛克
答案 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