Как закодировать строку буфера протокола в двоичный файл, используя протокол

Я пытался кодировать строки с помощью утилиты protoc cli. Заметил, что вывод по-прежнему содержит простой текст. Что я делаю неправильно?

osboxes@osboxes:~/proto/bin$ cat ./teststring.proto
syntax = "proto2";
message Test2 {
  optional string b = 2;
}

echo b:\"my_testing_string\"|./protoc --encode Test2 teststring.proto>result.out

result.out содержит:

^R^Qmy_testing_string

версии protoc libprotoc 3.6.0 и libprotoc 2.5.0

1 ответ

Просто чтобы оформить в ответ:

Команда, как написано, должна быть в порядке; вывод - двоичный файл protobuf - он просто напоминает текст, потому что protobuf использует utf-8 для кодирования строк, а в вашем контенте преобладает строка. Однако, несмотря на это: файл на самом деле не является текстовым, и вы должны обычно использовать средство просмотра в шестнадцатеричном формате или подобное, если вам нужно его проверить.

Если вы хотите понять внутренности файла, https://protogen.marcgravell.com/decode - хороший ресурс - он разрывает входной файл или шестнадцатеричную строку в соответствии с правилами протокола и сообщает вам, что означает каждый байт (заголовки полей, префиксы длины, полезные нагрузки и т. д.).

Я предполагаю, что ваш файл на самом деле:

(hex) 10 11 6D 79 5F и т. д.

то есть 0x10 = "поле 2, длина префикса", 0x11 = 17 (длина полезной нагрузки, закодированная как varint), затем "my_testing_string", закодированная как 17 байтов UTF8.

protoc --proto_path=${protobuf_path} --encode=${protobuf_message} ${protobuf_file} < ${source_file} > ${output_file}

и в этом случае:

protoc --proto_path=~/proto/bin --encode="Test2" ~/proto/bin/teststring.proto < ${source.txt} > ./output.bin

или:

cat b:\"my_testing_string\" | protoc --proto_path=~/proto/bin --encode="Test2" ~/proto/bin/teststring.proto > ./output.bin
Другие вопросы по тегам