python 二进制文件处理

发布时间:2019-08-24 09:21:16编辑:auto阅读(1828)



    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)
    


关键字