python 二进制文件处理

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ygyoe/article/details/79485449


python 二进制文件处理

采用python处理二进制文件,文件打开方式需要设置成"rb"或"wb",使读写的数据流是二进制。还需要进行二进制数据和普通数据之间的转换。这时会用到python的包struct里的两个函数pack和unpack。pack函数将普通数据打包成二进制数据;而unpack数据将二进制数据分解成普通数据。

 help(struct.unpack)
Help on built-in function unpack in module _struct:

unpack(...)
    unpack(fmt, buffer) -> (v1, v2, ...)
    
    Return a tuple containing values unpacked according to the format string
    fmt.  Requires len(buffer) == calcsize(fmt). See help(struct) for more
    on format strings.
help(struct.pack)
Help on built-in function pack in module _struct:

pack(...)
    pack(fmt, v1, v2, ...) -> bytes
    
    Return a bytes object containing the values v1, v2, ... packed according
    to the format string fmt.  See help(struct) for more on format strings.

上述fmt中,支持的格式为:

FORMAT C TYPE PYTHON TYPE STANDARD SIZE NOTES
x pad byte no value    
c char string of length 1 1  
b signed char integer 1 (3)
B unsigned char integer 1 (3)
? _Bool bool 1 (1)
h short integer 2 (3)
H unsigned short integer 2 (3)
i int integer 4 (3)
I unsigned int integer 4 (3)
l long integer 4 (3)
L unsigned long integer 4 (3)
q long long integer 8 (2), (3)
Q unsigned long long integer 8 (2), (3)
f float float 4 (4)
d double float 8 (4)
s char[] string    
p char[] string    
P void * integer   (5), (3)

注1.q和Q只在机器支持64位操作时有意义

注2.每个格式前可以有一个数字,表示个数

注3.s格式表示一定长度的字符串,4s表示长度为4的字符串,但是p表示的是pascal字符串

注4.P用来转换一个指针,其长度和机器字长相关

注5.最后一个可以用来表示指针类型的,占4个字节

为了同c中的结构体交换数据,还要考虑有的c或c++编译器使用了字节对齐,通常是以4个字节为单位的32位系统,故而struct根据本地机器字节顺序转换.可以用格式中的第一个字符来改变对齐方式.定义如下:

CHARACTER BYTE ORDER SIZE ALIGNMENT
@ native native native
= native standard none
< little-endian standard none
> big-endian standard none
! network (= big-endian) standard none

对齐方式放在fmt的第一个位置,如’@5s6sif’表示采用native的对齐方式,数据由5个长度的字符串,6个长度的字符串,一个整型和一个浮点数组成。



a='hello'

b='world!

'c=2d=45.123

bytes=struct.pack('5s6sif',a,b,c,d)

a,b,c,d=struct.unpack('5s6sif',bytes)


展开阅读全文

没有更多推荐了,返回首页