Protocol Buffers
各フィールドごとに順番にエンコードされるが、各フィールドの先頭にはタグ番号と3ビットで表現された型の種類がつく。
int32などの整数値をエンコードした場合、必ず4バイト使うというわけではなく、0に近い数字はより少ないバイト数で表現される可変長数値表現を利用している。7ビット以下で表現できる整数は1バイトでエンコードされる。int32もint64もエンコード結果は同じ値になる。タグ番号+3ビット型種別も同じく可変長数値表現でエンコードされる。ただしfixed32、fixed64などを使うと固定長でエンコードされる。またfloat、double などの浮動小数点数も固定長でエンコードされる。
文字列やバイト配列は、先頭に長さがつく形でエンコードされる。長さは上記の可変長数値表現を使っているため、長さの32ビット制限などはない。文字列はUTF-8で符号化する。
可変長数値表現は数値をリトルエンディアンで表現し7ビット単位で区切り、それぞれの最上位ビットにフラグを立てて8ビット単位のバイト列に変換する。最上位ビットは最終バイトだけ0として、それ以外は1を立てる。符号付き整数の場合はジグザグエンコーディングを使い、32ビットの場合は (n << 1) ^ (n >> 31) で正の数に変換してから可変長数値表現を使う。両方を併用した場合、-64〜63が1バイト、-8192〜8191が2バイトになり、32ビット整数は最長5バイトで表現される。