8.22.2013

How to Convert Int to ByteArray in Python

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 件のコメント:

コメントを投稿