1. 程式人生 > >問題21:如何處理二進制文件

問題21:如何處理二進制文件

oid n) see ron idt pat HR 只讀 nbsp

一、二進制文件的結構

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])

問題21:如何處理二進制文件