2012-04-10 2 views
5

Так как я не получаю ответ на вопрос this Я должен прототип и проверить себя, так как мои заголовки набора данных должны быть фиксированными, мне нужны фиксированные строки размера. Итак, можно ли указать строки фиксированного размера или массивы байтов в буферах протоколов? Это не совсем очевидно здесь, и я вроде как плохо отношусь к форсированию строк фиксированного размера в сообщении заголовка. --i.e, std::string('\0', 128);протокольные буферы: нет обозначений для буферов фиксированного размера?

Если нет, я бы предпочел использовать #pragma pack(1) struct header {...}; '

редактировать

Вопрос косвенно ответил here. Ответит и за исключением

ответ

2

protobuf не имеет такой концепции в протоколе, ни в языке схемы .proto. В строках и блоках данные всегда технически переменной длины с использованием префикса длины (который сам использует varint-кодирование, поэтому даже длина является переменной длиной).

Конечно, если вы только сохраняете данные определенной длины, то они выстраиваются в линию. Также обратите внимание, что поскольку строки в protobuf являются unicode с использованием кодировки UTF-8, длина закодированных данных равна , а не, так же просто, как и количество символов (если только вы не используете только символы ASCII).

0

Это небольшое пояснение к предыдущему ответу. Буферы протоколов не кодируют строки как UTF-8, он кодирует их как обычные байты. В проводном формате будет количество потребляемых байтов, за которыми следуют фактические байты. См. https://developers.google.com/protocol-buffers/docs/encoding/.

В то время как формат проводной связи всегда один и тот же, буферы протоколов предоставляют два интерфейса для использования разработчиками, строку и байты, причем основное отличие состоит в том, что первый обычно пытается предоставить типы строк разработчику, последний попытается предоставить типы байтов (Ie Java предоставит String для строки и ByteArray для байтов).

+0

UTF-8 - это кодировка Unicode - он принимает символы Unicode в байтах. Protobuf использует UTF-8 для получения обычных байтов. – solidsnack

+0

@snack можете ли вы, пожалуйста, внимательно перечитать первое сообщение. – Claris

Смежные вопросы