Как прочитать исправленное целое число32 с помощью protobuf-net? - PullRequest
1 голос
/ 07 декабря 2011

Это кажется основным вопросом, но у меня есть сомнения, может быть, потому что я использую 2 разные библиотеки для записи и чтения данных. Программа My Write написана на c ++, которая использует буферную библиотеку протокола Google. Мой читатель реализован в .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 # для чтения вышеуказанных полей? Я понимаю, как читать сообщения буфера протокола, но не уверен в том, как читать вышеуказанные данные.

С уважением, Alok

1 Ответ

1 голос
/ 07 декабря 2011

Этот заголовок файла не является допустимой последовательностью 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...