Python: 数値などをバイト配列に変換する方法
Python 2.5 より登場した struct モジュールを使うと便利。
詳細は以下を参照。
7.3. struct — 文字列データをパックされたバイナリデータとして解釈する — Python 2.7ja1 documentation
下記は全てリトルエンディアンのマシン下での実行例。
>>> import struct
- Int からバイト配列の変換
>>> struct.pack('i', 1) '\x01\x00\x00\x00' >>> [struct.pack('i', x) for x in (0, 1, 65, -1, 2000000000)] ['\x00\x00\x00\x00', '\x01\x00\x00\x00', 'A\x00\x00\x00', '\xff\xff\xff\xff', '\x00\x945w'] >>> [len(struct.pack('i', x)) for x in (0, 1, 65, -1, 2000000000)] [4, 4, 4, 4, 4]
- ビッグエンディアンで格納
>>> struct.pack('>i', 1) '\x00\x00\x00\x01' >>> struct.pack('!i', 1) '\x00\x00\x00\x01'
- Int 以外の型のエンコード
>>> struct.pack('3?Q', True, False, True, 5L) '\x01\x00\x01\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00' >>> struct.pack('dc10s', 0.025, 'X', 'python') '\x9a\x99\x99\x99\x99\x99\x99?Xpython\x00\x00\x00\x00'
- バイト配列から Int へのデコード
>>> struct.unpack('i', '\x01\x02\x03\x04') (67305985,)
要素が一つでもタプルが返る。 - Struct クラスを使う
>>> s = struct.Struct('i') >>> s.pack(1) '\x01\x00\x00\x00'
フォーマット文字列がコンパイルされた状態で保持される。
同じフォーマットを何度も使い回す場合に効率的。
0 件のコメント:
コメントを投稿