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

Posted Volcano!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了问题21:如何处理二进制文件相关的知识,希望对你有一定的参考价值。

一、二进制文件的结构

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

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

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

2、打开二进制文件

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

3、读取文件:f.read(size),读取的文件内容为字节;如:\\x10\\x00\\x00\\x01\\x02\\x0D等,一个\\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\'\\x14\\x00\\x00\\x00\\x90\\x01\\x00\\x00\' <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()
 

以上是关于问题21:如何处理二进制文件的主要内容,如果未能解决你的问题,请参考以下文章

在片段之间切换时如何处理相机?

17如何对字符串进行左, 右, 居中对齐 18如何去掉字符串中不需要的字符 19如何读写文本文件 20如何处理二进制文件 21如何设置文件的缓冲

如何处理片段和活动中的后压

自然模板(例如Thymeleaf)时如何处理代码重复?

如何处理片段上的触摸事件?

您如何处理源代码管理中的 Visual Basic 6.0 frm 和 frx 文件?