Welcome 微信登录

首页 / 操作系统 / Linux / Python 二进制读写

总的感觉,python本身并没有对二进制进行支持,不过提供了一个模块来弥补,就是struct模块。python没有二进制类型,但可以存储二进制类型的数据,就是用string字符串类型来存储二进制数据,这也没关系,因为string是以1个字节为单位的。import structa=12.34#将a变为二进制bytes=struct.pack("i",a)此时bytes就是一个string字符串,字符串按字节同a的二进制存储内容相同。再进行反操作现有二进制数据bytes,(其实就是字符串),将它反过来转换成python的数据类型:a,=struct.unpack("i",bytes)注意,unpack返回的是tuple
所以如果只有一个变量的话:bytes=struct.pack("i",a)那么,解码的时候需要这样a,=struct.unpack("i",bytes) 或者 (a,)=struct.unpack("i",bytes)如果直接用a=struct.unpack("i",bytes),那么 a=(12.34,) ,是一个tuple而不是原来的浮点数了。如果是由多个数据构成的,可以这样:a="hello"b="world!"c=2d=45.123bytes=struct.pack("5s6sif",a,b,c,d)此时的bytes就是二进制形式的数据了,可以直接写入文件比如 binfile.write(bytes)然后,当我们需要时可以再读出来,bytes=binfile.read()再通过struct.unpack()解码成python变量
a,b,c,d=struct.unpack("5s6sif",bytes)"5s6sif"这个叫做fmt,就是格式化字符串,由数字加字符构成,5s表示占5个字符的字符串,2i,表示2个整数等等,下面是可用的字符及类型,ctype表示可以与python中的类型一一对应。 
FormatC TypePython字节数
xpad byteno value1
ccharstring of length 11
bsigned charinteger1
Bunsigned charinteger1
_Boolbool1
hshortinteger2
Hunsigned shortinteger2
iintinteger4
Iunsigned intinteger or long4
llonginteger4
Lunsigned longlong4
qlong longlong8
Qunsigned long longlong8
ffloatfloat4
ddoublefloat8
schar[]string1
pchar[]string1
Pvoid *long
最后一个可以用来表示指针类型的,占4个字节