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”
文字列形式に変換
バイト配列に変換
バイトリストに変換
2.6以降のバージョンの場合:
ただし、印刷できない文字列が発生する可能性があります.例えば、x12x 45x 00 ABの場合は、使用しないでください.decode(“hex”)
次はbytearrayに戻り、python 3で正常に動作します.
bytearray.fromhex(“de ad be ef 00”)
binasciiの使用
ダイレクトライタ
byte型文字列の復元
1 2 3 4 5
整数間の進数変換:
文字列の回転数:
バイトシリアル整数:
整数バイト列:
文字列:
バイトシリアル文字列:
仮定: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
a
=
b
'\xfa\xaa\x00\x14\tcT9000027\x10\x01\x03\xeb\xbb\xfb'
b
=
a.
hex
()
# 16
y
=
bytes().fromhex(b)
#16
c
=
int
(s,
16
)
# 16 10
d
=
hex
(c)
#10 16