python 十进制、16进制、字符串、字节之间的转换

python 十进制、16进制、字符串、字节之间的转换

进行协议解析时,总是会遇到各种各样的数据转换的问题,从二进制到十进制,从字节串到整数等等

1、整数之间的进制转换:

# 10进制转16进制
In [37]: hex(16)
Out[37]: '0x10'

# 16进制转10进制
In [38]: int('0x10', 16) 
Out[38]: 16

2、字符串转整数:

# 10进制字符串
In [34]: int('10') 
Out[34]: 10

# 16进制字符串
In [35]: int('10', 16)
Out[35]: 16

# 16进制字符串
In [36]: int('0x10', 16)
Out[36]: 16

3、字节串转整数:

In [41]: import struct  

# 转义为short型整数
In [42]:  struct.unpack('<hh', bytes(b'\x01\x00\x00\x00')) 
Out[42]: (1, 0)

# 转义为long型整数
In [43]: struct.unpack('<L', bytes(b'\x01\x00\x00\x00'))
Out[43]: (1,)

4、整数转字节串:

# 转为两个字节
In [44]: struct.pack('<HH', 1,2)
Out[44]: b'\x01\x00\x02\x00'

# 转为四个字节
In [45]: struct.pack('<LL', 1,2)
Out[45]: b'\x01\x00\x00\x00\x02\x00\x00\x00'

5、字符串转字节串:

# 字符串编码为字节码
In [46]: '12abc'.encode('ascii')
Out[46]: b'12abc'

# 数字或字符数组
In [47]: bytes([1,2, ord('1'),ord('2')]) 
Out[47]: b'\x01\x0212'

# 16进制字符串
In [48]: bytes().fromhex('010210') 
Out[48]: b'\x01\x02\x10'

# 16进制字符串
In [49]: bytes(map(ord, '\x01\x02\x31\x32'))
Out[49]: b'\x01\x0212'

# 16进制数组
In [50]: bytes([0x01,0x02,0x31,0x32])
Out[50]: b'\x01\x0212'

6、字节串转字符串:

# 字节码解码为字符串
In [62]: bytes(b'\x31\x32\x61\x62').decode('ascii') 
Out[62]: '12ab'

# 字节串转16进制表示,夹带ascii
In [63]: str(bytes(b'\x01\x0212'))[2:-1] 
Out[63]: '\\x01\\x0212'

# 字节串转16进制表示,固定两个字符表示
In [64]: str(binascii.b2a_hex(b'\x01\x0212'))[2:-1] 
Out[64]: '01023132'

# 字节串转16进制数组
In [65]:  [hex(x) for x in bytes(b'\x01\x0212')] 
Out[65]: ['0x1', '0x2', '0x31', '0x32']
updated_at 01-05-2017