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