Как закодировать строку буфера протокола в двоичный файл, используя протокол
Я пытался кодировать строки с помощью утилиты 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