2015-02-16 2 views
1

В кодере спецификации буферов протокола https://developers.google.com/protocol-buffers/docs/encoding, говорится, что:протокола буферы отрицательного int32/int64 кодера смазаны

Если вы используете int32 или int64 в качестве типа для отрицательного числа, в результате varint всегда десять байт долго - это, по сути, рассматриваться как очень большое беззнаковое целое

хорошо, что выглядеть хорошо, но с 10 байт длиной varint, вы можете хранить 70 бит длинное целое, и тип 64 бит. Таким образом, 6 бит не используются ... если эти биты будут установлены в 1 или 0?

к summup, с int32/64, должны -1 быть закодирован как

FF FF FF FF FF FF FF FF FF 7F

или

FF FF FF FF FF FF FF FF FF 01

?

ответ

2

Бит 64 и выше должны быть равны нулю. Итак, в C++ вы кодируете int64, отбрасывая его на uint64, а затем кодируя, как любое другое целое без знака (это фактически то, что делает библиотека Protobuf C++). Имейте в виду, что int32 s должны быть расширены до 64 бит.

+0

Обратите внимание, что, например, Протобуф C++ Google будет правильно декодировать недопустимый расширенный отрицательный int32, но, например, Python protobuf не будет. Не удивлюсь, если несколько реализаций там сделают это неправильно, я виноват по крайней мере один (https://code.google.com/p/nanopb/issues/detail?id=97) – jpa