CBORのデータ構造
ヘッダのオクテットの構成
上位3ビット(0-2) Major type (メジャータイプ)
下位5ビット(3-7) Additional information (追加情報) (0x00~0x1f)
ネットワークの場合のビット番号とオクテット順に注意
ビット番号は0がMSB(上位)(一般的な2^n の指数によるビット番号と逆になる)
オクテット順はビッグエンディアンになる。0x1234 という値は 0x12, 0x34 の順に入る。
追加情報はメジャータイプにより解釈が変わるが、メジャータイプ0~6までは以下のように解釈する。
ここでの「値」は、最終的な値、オクテット列の長さ、タグ番号として使われる値。
追加情報が24(0x18)未満
追加情報が値そのもの
追加情報が24(0x18)
続く1オクテットの整数が値
追加情報が25(0x19)
続く2オクテットの整数が値
追加情報が26(0x1a)
続く4オクテットの整数が値
追加情報が27(0x1b)
続く8オクテットの整数が値
追加情報が31(0x1f) (長さの場合のみ)
不定長を示す
不定長の終端は、break (メジャータイプ7、追加情報31 (= 0b111_11111 = 0xff)) で示す。
バイト列、文字列の不定長の表現方法(2段になる。)
code:txt
5f -- 不定長バイト列の開始
44 -- 4バイトの固定長バイト列
aabbccdd -- 実際のデータ
43 -- 3バイトの固定長バイト列
eeff00 -- 実際のデータ
ff -- 不定長バイト列の終了
メジャータイプ0
0または正の整数(符号なし整数)
「追加情報による値」をそのまま値とする。
メジャータイプ1
負の整数
「-1 - 追加情報による値」を値とする。
(2の補数にすることを指していて、固定長ならビット反転するだけでいいはず。)
追加情報が 0 ならば意味は -1 - 0 = -1
追加情報が 1 ならば意味は -1 - 1 = -2
メジャータイプ2
バイト列
「追加情報による値」を長さとして、続くバイト列を値とする。
メジャータイプ3
文字列
「追加情報による値」を長さとして、続くバイト列をUTF-8の文字列とする。
生の文字列で、エスケープなどはされない。
メジャータイプ4
配列(リスト、シーケンス、タプル)
「追加情報による値」を要素数として、続くCBORデータを配列の要素とする。
メジャータイプ5
マップ(テーブル、辞書、ハッシュ、オブジェクト)
「追加情報による値」を要素数として、続く2つのCBORデータの組をキーと値としてマップの要素とする。
メジャータイプ6
タグ
「追加情報による値」をタグIDとして、続くCBORデータをそのタグの要素とする。
タグによってどういうデータを取るのかが決まっている。
例えば正の巨大整数の場合、タグは2で、続くのはバイト列になる。
code:txt
C2 # tag(2)
48 # bytes(8)
0123456789ABCDEF
メジャータイプ7
追加情報が24(0x18)未満
追加情報で単純値(Simple Values)を示す
追加情報が24(0x18)
続く1バイトの整数で単純値(Simple Values)を示す。(現在未定義)
追加情報が25
IEEE 754 半精度浮動小数点数(16bit)
追加情報が26
IEEE 754 単精度浮動小数点数(32bit)
追加情報が27
IEEE 754 倍精度浮動小数点数(64bit)
追加情報が31
ブレーク(break)
不定長の終端を示す。
単純値(Simple Values)
20
false
21
true
22
null
23
undefined