ちりもつもればミルキーウェイ

好奇心に可処分時間が奪われる

protobuf のエンコーディング仕様ざっとよんだ感想

developers.google.com

以下感想

  • protobufのエンコーディングwireっていうバイナリエンコーディングでやってる
  • wireJSONなどど比較してフィールド名を省略してフィールド番号にすることでバイトの削減と互換のとりやすさを実現していて面白い
    • フィールド番号とtypeが同じならお互いの.protoで定義されたmessage schema間でフィールド名が違っても動作に影響はない
  • 仕様の雑メモ
    • タグのbyteの末尾3bitがtype, のこりがフィールド番号?
      • フィールド数が5bit(最大31)を超えたらどうなるかあんまよくわからん
    • 文字列はvalueの先頭1byte目に長さを持つ
      • 1byte(最大255)で表現できる長さを超えた時どうなるかはあんまよくわからん
    • 固定長のtypeのvalueは値がそのまま入る
    • 可変長バイト列のtypeは上位1bitが終端バイトかどうかの情報をもつ
    • 可変長バイト列を連結するときは順番をひっくり返して結合する
    • 可変長バイト列の場合、int64型とかをつかって負数が出たときは2の補数表現になるので必ず最上位bitが立って、絶対値が小さくても使うバイト数がめっちゃ多くなる
    • sint64(signed int)型を使うとZigZag encodingを使うので絶対値が小さいときは使うバイト数が少なくなる。負数が登場する場合はこちらがおすすめ
      • 00000001 → -1
      • 00000010 → 1
      • 00000011 → -2
      • 00000100 → 2
      • ...
      • みたいに交互に+-を行ったり来たりすることで絶対値が小さいときは負数でも使用byte数が小さくなる

などなど。細かいところはもうちょいあるけどおもしろかった。