• 问题21:如何处理二进制文件


    问题21:如何处理二进制文件

     

    一、二进制文件的结构

    1、结构:头部信息 + 数据;

     头部信息:是对这个文件是结构的介绍信息,相当于书本的目录;

     数据:文件各个结构的具体信息,相当于书本的内容;

    2、打开二进制文件

      例:f = open(path, 'rb'):以只读形式打开指定文件;

    3、读取文件:f.read(size),读取的文件内容为字节;如:x10x00x00x01x02x0D等,一个x10代表一个字节;

    4、解析读取的字节数据:struct模块下的unpack方法(更多参见:Python:struct模块的pack、unpack

    #格式:struct.unpack('数据类型', f.read(size))

    #数据类型:如下表,struct.unpack('h', f.read(size)),表示解析成short类型;'i',表示解析成int类型;

    #f.read():表示需要被解析的字节类型的数据;

    #struct 类型表

    FormatC TypePython typeStandard sizeNotes
    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 1  
    p char[] string    
    P void * integer   (5), (3)
    复制代码
    import struct
    
    a = 20
    b = 400
    s = struct.pack('ii', a, b)
    print(s, type(s))
    #输出:b'x14x00x00x00x90x01x00x00' <class 'bytes'>
    print('length: ', len(s))
    #输出:length:  8
    s2 = struct.unpack('ii', s)
    print(s2)
    #输出:(20, 400)
    
    s2 = struct.unpack('ii', s)
    #报错:unpack requires a buffer of 4 bytes
    #==>解压需要一个4字节的缓冲区,也就是说'ii'表示8个字节的缓冲
    复制代码

    5、直接读取文件数据(存放到数组内),而不是再返回一个字符串

    复制代码
    import array
    
    f = open('test.wav')
    #将文件指针从首端移到末尾;
    f.seek(0, 2)
    #f.tell():返回从指针位置到文件末尾的字节数;
    n = f.tell()/2
    #创建一个数据类型为'h',长度为n的数组;
    buf = array.array('h', (o for _ in range(n)))
    #将文件指针从末尾移到首端;
    f.seek(2, 0)
    #将文件二进制数据直接读取到buf数组内;
    f.readinto(buf)
    #查看数组内数据
    print(buf[index])
    f.close()
    
    #缩小文件大小
    for i in range(n):
        buf[i] /= 8
    #将更改后的数据写入新文件,以写入二进制文件的形式
    f2 = open('demo.wav', 'wb')
    #将数组内数据写入文件内:采用array.tofile(file)
    buf.tofile(f2)
    f2.close()
  • 相关阅读:
    MFC学习之程序执行过程梳理
    二分法插入排序
    内存泄漏以及常见的解决方法
    Ant命令行操作
    Android Intent的几种使用方法全面总结
    YII 页面缓存
    JAVA修饰符类型(public,protected,private,friendly)
    unity3d插件Daikon Forge GUI 中文教程-5-高级控件listbox和progress bar的使用
    ostringstream的使用方法
    程序猿接私活经验总结,来自csdn论坛语录
  • 原文地址:https://www.cnblogs.com/valorchang/p/11434494.html
Copyright © 2020-2023  润新知