Skip to content

Instantly share code, notes, and snippets.

@long-long-float
Last active June 11, 2023 16:48
Show Gist options
  • Save long-long-float/371cc292a20c3257d057a9a076c5ee83 to your computer and use it in GitHub Desktop.
Save long-long-float/371cc292a20c3257d057a9a076c5ee83 to your computer and use it in GitHub Desktop.
FlatBuffersのバイナリフォーマット

FlatBuffersのバイナリフォーマット

この文章は筆者の理解のために書かれたもので、内容の正しさは保証しない。

参考

構築

バッファはroot tableで表される uoffset_t から開始される。

現在の実装では、バッファを逆向きに構築する。

Scalar

  • uoffset_t
    • 基本は uint32_t
    • signedな soffset_t も存在する
  • voffset_t
    • uint16_t

その他のプリミティブ型は https://github.com/dvidelabs/flatcc/blob/master/doc/binary-format.md#primitives

Enums

Enumを定義した際に与えたunderlying typeとなる。

flatcでは、tableのenumフィールドにデフォルト値を与えると、そのフィールド値がデフォルト値の場合にvtableの値が0になるので注意(実装依存?)。

Unions

unionの値が設定されていないことを表すenum値である NONE が予約されている。

説明
enum representing the union choice どの型が含まれているか
uoffset_t 実際の値へのオフセット

StringsとVectors

  • 親にインラインで格納されるのではなく そのアドレスからの オフセットで参照される
    • 例: vectorが 0x38 に格納されており、そのデータが 0x0c ならば実データは 0x38 + 0x0c = 0x44 に格納される
  • Stringsはbyte型のVectorsであり、常にnull終端である。
説明
32bit element count null終端を含まない要素数
scalar 要素
... ...

Objects

Structs

  • 自身がその親に直接格納される
  • コンポーネントはそのサイズでアラインされる
  • Structsは最大のスカラメンバーにアラインされる
  • 定義順に値が格納される

Tables

  • Structsとは異なり、親にインラインで格納されるのではなくオフセットで参照される
説明
soffset_t vtableへのオフセット。オブジェクトの開始位置から減算される
scalar or uoffset_t アラインされたフィールドの値。順序が決まっておらずすべてのフィールドが存在する必要はない。
... ...

フィールドへはvtableを用いてアクセスする。vtableの構造は以下の通り。

説明
voffset_t vtableのバイト単位のサイズ(この要素を含む)。バリデーションに使われる。
voffset_t オブジェクトのサイズ(vtable offsetを含む)
voffset_t フィールドへのオフセット値。範囲外または0の場合は、フィールドの値が存在しないことを表す。
... 上の要素がN個続く。Nはフィールド数。
  • フィールドに初期値が設定されているときにvtableのその要素がスキップされる?
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment