二进制¶
bytes and bytearray¶
bytes 和 bytearray的差別,一个可变一个不可变:
blist = [1, 2, 3, 255]
the_bytes = bytes(blist)
print(the_bytes) # b'\x01\x02\x03\xff'
the_byte_array = bytearray(blist)
print(the_byte_array) # bytearray(b'\x01\x02\x03\xff')
the_byte_array[1] = 127 #可变
print(the_byte_array) # bytearray(b'\x01\x7f\x03\xff')
使用struct转换二进制文件¶
使用标准函数库里的struct來作为转换二进制文件:
< 小端方案
> 大端方案
标识符 |
描述 |
字节 |
---|---|---|
x |
跳过一个字节 |
1 |
b |
有符号字节 |
1 |
B |
无符号字节 |
1 |
h |
有符号短整数 |
2 |
H |
无符号短整数 |
2 |
i |
有符号整数 |
4 |
I |
无符号整数 |
4 |
l |
有符号长整数 |
4 |
L |
无符号长整数 |
4 |
Q |
无符号 long long 型整数 |
8 |
f |
单精度浮点数 |
4 |
d |
双精度浮点数 |
8 |
p |
数量和字符 |
1 + 数量 |
s |
字符 |
数量 |
实例:
import struct
valid_png_header = b'\x89PNG\r\n\x1a\n' #png的文件头
data = (b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR' +
b'\x00\x00\x00\x9a\x00\x00\x00\x8d\x08\x02\x00\x00\x00\xc0') #一张图文件的前段
if data[:8] == valid_png_header:
width, height = struct.unpack('>LL', data[16:24])
print('Valid PNG, width', width, 'height', height) # Valid PNG, width 154 height 141
else:
print('Not a valid PNG')
#反过来转换
print(struct.pack('>L', 154)) # b'\x00\x00\x00\x9a'
print(struct.pack('>L', 141)) # b'\x00\x00\x00\x8d'
print(data[16:24]) # b'\x00\x00\x00\x9a\x00\x00\x00\x8d'
print(struct.unpack('>2L', data[16:24])) # (154, 141)
print(struct.unpack('>16x2L6x', data)) # (154, 141)
其他二进制工具¶
bitstring( https://code.google.com/p/python-bitstring/ )
construct( http://construct.readthedocs.org/en/latest/ )
binio( http://spika.net/py/binio/
binascii函数¶
十六进制、六十四进制、uuencoded,等等之间的转换函数:
import binascii
#八字节转十六bytes
valid_png_header = b'\x89PNG\r\n\x1a\n'
print(binascii.hexlify(valid_png_header)) # b'89504e470d0a1a0a'
#十六bytes转八bytes
print(binascii.unhexlify(b'89504e470d0a1a0a')) # b'\x89PNG\r\n\x1a\n'