У меня есть coredump с закодированными данными protobuf, и я хочу декодировать эти данные и посмотреть содержимое. У меня есть .proto-файл, который определяет это сообщение в буфере необработанных протоколов. Мой файл прото выглядит следующим образом:Как декодировать двоичные/необработанные данные goob protobuf
$ cat my.proto
message header {
required uint32 u1 = 1;
required uint32 u2 = 2;
optional uint32 u3 = 3 [default=0];
optional bool b1 = 4 [default=true];
optional string s1 = 5;
optional uint32 u4 = 6;
optional uint32 u5 = 7;
optional string s2 = 9;
optional string s3 = 10;
optional uint32 u6 = 8;
}
И protoc версия:
$ protoc --version
libprotoc 2.3.0
Я попытался следующие:
дамп исходных данных из ядра
(gdb) dump memory b.bin 0x7fd70db7e964 0x7fd70db7e96d
Передайте его protoc
//proto file (my.proto) is in the current dir
$ protoc --decode --proto_path=$pwd my.proto < b.bin
Missing value for flag: --decode
To decode an unknown message, use --decode_raw.
$ protoc --decode_raw < /tmp/b.bin
Failed to parse input.
Любые мысли о том, как в десятичную одеть его? В документации недостаточно объясняется, как это сделать.
Edit: данных в двоичном формате (10 байт)
(gdb) x/10xb 0x7fd70db7e964
0x7fd70db7e964: 0x08 0xff 0xff 0x01 0x10 0x08 0x40 0xf7
0x7fd70db7e96c: 0xd4 0x38
Спасибо за ответ, я добавил необработанные байты (10 байтов) в мой вопрос выше. И да, здесь будут установлены только некоторые необязательные поля, поэтому это ожидается. – brokenfoot
@brokenfoot: Мне кажется, что байты, которые вы дали, действительно разбираются успешно - я отредактировал ответ, чтобы показать это. Так или иначе, 'b.bin' не должен был содержать именно эти байты. Команда 'dump memory', которую вы указали, выглядит так, что она сбросит только 9 байтов. Помните, что дамп * не * включает в себя байт на конечном адресе - он включает до байта непосредственно перед ним. –
Отлично! Я не знал о команде памяти дампа, не включая последний байт в выходе. Большое спасибо! – brokenfoot