以下のサイトを参考にpythonで自動変換を実施したいです。
方法をご教示頂けないでしょうか
どうゆう法則性で変換するのか?
なぜサイズが違うのかが全然わかりません
Value CBOR JSON
0 1 1
23 1 2
[1, 2, 3, 4] 5 9
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
Value | CBOR (バイト列) | CBOR len | JSON (文字列) | JSON len |
---|---|---|---|---|
0 | \x00 | 1 | "0" | 1 |
23 | \x17 | 1 | "23" | 2 |
[1,2,3,4] | \x84 \x01 \x02 \x03 \x04 | 5 | "[1,2,3,4]" | 9 |
こういうことでしょうか。
なぜサイズが違うのかが全然わかりません
「バイト」単位でデータを見ても解り難いですが、「ビット」単位だと未使用領域が有り
一般的にバイナリフォーマットでは、ビット単位でメモリを効率良く使うことで省サイズを実現します。
全部説明するとなると膨大な量になるので、
例に挙げられた値のみに絞って説明します。
- 0..23迄の整数
- 0..23迄の長さの配列
0..23 の範囲の整数
- JSONでは、数値の桁数=サイズ
- CBORでは変換なし。サイズは常に1
python
1def cbor_encode_number(num): 2 if 24 > num >= 0: # 0..23の範囲 3 return bytes([num & 0xff]) # 常に1バイト 4 elif 256 > num >= 24: # 24..255の範囲 5 return bytes([0x18, num & 0xff]) # 常に2バイト 6 else: 7 raise NotImplementedError("no supported out of number 0..255")
※注意。ここでは、理解しやすくするために「数値のリスト」を用いてますが、
実際にバイナリを必要とする場面は、処理速度・省メモリ等の面での
最適化が求められることが多いので、より効率の良い方法で実装されます。
長さ23迄の配列
- JSON では、配列の始点終点の [] に2バイト、区切り文字で 要素数-1の3バイト + データ(1234)の4バイト (2+3+4=計9バイト)
- CBOR では1バイト目に配列であることの印とその長さの情報を含みます
小さな数(0..23)の配列であれば、そのデータサイズは 1+要素数
python
1def cbor_encode_array(seq): 2 # 長さ23迄の配列 3 assert len(seq) < 24 4 result = bytearray([0x80 | len(seq)]) 5 for val in seq: 6 result.extend(cbor_encode(val)) 7 return bytes(result) 8 9def cbor_encode(value): 10 if isinstance(value, int): 11 return cbor_encode_number(value) 12 elif isinstance(value, list): 13 return cbor_encode_array(value) 14 else: 15 raise NotImplementedError("unknown data type") 16 17if __name__ == '__main__': 18 print(repr(cbor_encode(0))) # => b'\x00' 19 print(repr(cbor_encode(23))) # => b'\x17' 20 print(repr(cbor_encode([1,2,3,4]))) # => b'\x84\x01\x02\x03\x04'
参考・関連
要バイナリに関する基礎知識:
ビット、バイト、16進数、2進数、補数、バイトオーダー、エンディアン、辺り
実際に自分で実装となると、この辺を参考にすると思います。
投稿2020/03/25 02:14
編集2020/03/25 05:40総合スコア8760
0
「python CBOR」でググると、1番目と2番目に以下のモジュールが出てきました。
cbor · PyPI
cbor2 · PyPI
投稿2020/03/25 01:37
総合スコア36960
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/26 01:42 編集
2020/03/25 06:15
2020/03/25 08:04 編集
2020/03/25 07:25 編集
2020/03/26 01:56
2020/03/26 05:11
2020/03/26 07:52 編集
2020/03/26 08:13 編集
2020/03/29 05:07
2020/03/29 10:08 編集