总的感觉,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中的类型一一对应。
| Format | C Type | Python | 字节数 |
|---|
| x | pad byte | no value | 1 |
| c | char | string of length 1 | 1 |
| b | signed char | integer | 1 |
| B | unsigned char | integer | 1 |
| ? | _Bool | bool | 1 |
| h | short | integer | 2 |
| H | unsigned short | integer | 2 |
| i | int | integer | 4 |
| I | unsigned int | integer or long | 4 |
| l | long | integer | 4 |
| L | unsigned long | long | 4 |
| q | long long | long | 8 |
| Q | unsigned long long | long | 8 |
| f | float | float | 4 |
| d | double | float | 8 |
| s | char[] | string | 1 |
| p | char[] | string | 1 |
| P | void * | long |
最后一个可以用来表示指针类型的,占4个字节