Как отмечается в ответ Мишеля де Рюйтера , вполне возможно, что ваше сообщение protobuf имеет префикс length . Предполагая, что это так, этот ответ должен помочь.
(ПРИМЕЧАНИЕ. Для большинства приведенных ниже команд я предполагаю, что ваше сообщение protobuf хранится в файле с именем input
.)
protoc --decode_raw
+ dd
для одного сообщения:
Если это просто одно сообщение, тогда вы действительно можете использовать protoc --decode_raw
, но сначала вам нужно удалить заголовок префикса длины. Предполагая, что заголовок имеет длину 4 байта, вы можете использовать dd
, чтобы удалить заголовок из input
, а затем передать вывод в protoc
.
dd bs=1 skip=4 if=input 2>/dev/null | protoc --decode_raw
protoc-decode-lenprefix --decode_raw
для одного сообщения:
Я также написал скрипт , который автоматически обрабатывает удаление заголовка:
protoc-decode-lenprefix --decode_raw < input
Этот скрипт - просто оболочка над protoc --decode_raw
, но он обрабатывает разбор заголовка префикса длины и затем вызывает protoc
.
Теперь этот сценарий не очень полезен в этом случае, потому что мы можем просто использовать вышеприведенный трюк dd
, чтобы удалить заголовок. Однако, скажем, у нас есть поток данных (например, файл или поток TCP), содержащий несколько сообщений, которые обрамлены заголовками с префиксом длины ....
protoc-decode-lenprefix --decode_raw
для потока сообщений:
Вместо одного сообщения protobuf во входном файле, скажем, input
содержало несколько сообщений protobuf, которые обрамлены заголовками с префиксом длины. В этом случае невозможно просто использовать трюк dd
, потому что вам нужно фактически прочитать содержимое заголовка префикса длины, чтобы определить, как долго последующее сообщение в потоке, и, следовательно, как много байтов впереди следующий заголовок + сообщение лежит. Таким образом, вместо того, чтобы беспокоиться обо всем этом, вы можете просто использовать protoc-decode-lenprefix
снова:
protoc-decode-lenprefix --decode_raw < input
protoc-decode-lenprefix --decode ... foo.proto
для потока сообщений
Этот сценарий также можно использовать для полного декодирования сообщений с префиксом длины (вместо простого «сырого декодирования» их). Предполагается, что у вас есть доступ к .proto
файлам, которые определяют сообщение protobuf, так же как и обернутая команда protoc
. Синтаксис вызова идентичен protoc --decode
. Например, используя трюк dd
с protoc --decode
вместе с входным файлом Mesos task.info , синтаксис выглядит следующим образом:
dd bs=1 skip=4 if=task.info 2>/dev/null | \
protoc --decode mesos.internal.Task \
-I MESOS_CODE/src -I MESOS_CODE/include \
MESOS_CODE/src/messages/messages.proto
И параметры идентичны при использовании protoc-decode-lenprefix
cat task.info | \
protoc-decode-lenprefix --decode mesos.internal.Task \
-I MESOS_CODE/src -I MESOS_CODE/include \
MESOS_CODE/src/messages/messages.proto