pythonバイト列および10進、16進相関変換

3192 ワード

プロトコル解析を行う場合、バイナリから10進数、バイト列から整数など、さまざまなデータ変換の問題に直面します.
整数間の進数変換:
  • 10進法16進法:hex(16)=>0 x 10
  • 16進10進:int('0 x 10',16)=>16
  • 似たようなものはoct()bin()
     
     
    文字列の回転数:
  • 10進数文字列:int('10')=>10
  • 16進文字列:int('10',16)=>16
  • 16進文字列:int('0 x 10',16)=>16
  •  
     
    バイトシリアル整数:
  • short型整数に変換:struct.unpack('  (1, 0)
  • long型整数に変換:struct.unpack('  (1,)

  •  
     
    整数バイト列:
  • から2バイトへ:struct.pack('  b'\x01\x00\x02\x00'
  • から4バイトへ:struct.pack('  b'\x01\x00\x00\x00\x02\x00\x00\x00'

  •  
     
    文字列:
  • 文字列はバイトコード:'12 abc'に符号化する.encode('ascii')  ==>  b'12abc'
  • 数字または文字配列:bytes([1,2,ord('1'),ord('2')])=>b'x 01x 0212'
  • 16進文字列:bytes()fromhex('010210')  ==>  b'\x01\x02\x10'
  • 16進文字列:bytes(map(ord,'x 01x 02x 31x 32')=>b'x 01x 0212'
  • 16進数配列:bytes([0 x 01,0 x 02,0 x 31,0 x 32])=>b'x 01x 0212'
  •  
     
    バイトシリアル文字列:
  • バイトコードは文字列:bytes(b'x 31x 32x 61x 62')に復号する.decode('ascii')  ==>  12ab
  • バイト直列16進数表現、バンドascii:str(bytes(b'x 01x 0212')[2:-1]=>x 01x 0212
  • バイトシリアル16進数表示、固定2文字表示:str(binascii.b 2 a_hex(b'x 01x 0212')[2:-1]=>01023132
  • バイト直列16進数配列:[hex(x)for x in bytes(b'x 01x 0212')]=>['0 x 1','0 x 2','0 x 31','0 x 32']
  •  
     
    仮定:hex_string = “deadbeef”
    文字列形式に変換
    >>> hex_data = hex_string.decode("hex")
    >>> hex_data
    "\xde\xad\xbe\xef"

    バイト配列に変換
    >>> import array
    >>> array.array('B', hex_data)
    array.array('B', [0xDE, 0xAD, 0xBE, 0xEF])

    バイトリストに変換
    >>> map(ord, hex_data)
    [0xDE, 0xAD, 0xBE, 0xEF]

    2.6以降のバージョンの場合:
    >>> bytearray(hex_data)
    bytearray(b'\xde\xad\xbe\xef')

    ただし、印刷できない文字列が発生する可能性があります.例えば、x12x 45x 00 ABの場合は、使用しないでください.decode(“hex”)
     
    次はbytearrayに戻り、python 3で正常に動作します.
    bytearray.fromhex(“de ad be ef 00”)
     
    binasciiの使用
    import binascii
    a='45222e'
    s=binascii.unhexlify(a)
    b=[ord(x) for x in s]

    ダイレクトライタ
    data = "fef0babe"
    bits = ""
    for x in xrange(0, len(data), 2)
    bits += chr(int(data[x:x+2], 16))

    byte型文字列の復元
    binascii.b2a_hex(hex_data)

    1 2 3 4 5 =   b '\xfa\xaa\x00\x14\tcT9000027\x10\x01\x03\xeb\xbb\xfb' =   a. hex ()  # 16 =   bytes().fromhex(b)   #16 c = int (s, 16 )    # 16 10 d = hex (c)  #10 16