欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python如何使用struct.unpack處理二進制文件

 更新時間:2024年02月10日 10:10:29   作者:AllardZhao  
這篇文章主要介紹了Python如何使用struct.unpack處理二進制文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

如何處理二進制文件?

實際案例

  • wav是一種音頻文件的格式,音頻文件為二進制文件。
  • wav文件由頭部信息和音頻采樣數(shù)據構成,前44個字節(jié)為頭部信息,包含聲道數(shù)、采樣頻率、PCM位寬等等,后面是音頻采樣數(shù)據。
  • 使用python分析一個wav文件頭部信息,處理音頻數(shù)據。

WAV格式如下:

簡單分為兩部分,第一部分前44個字節(jié)是音頻文件的一些信息,第二部分44個字節(jié)后面是音頻文件的采樣數(shù)據。

解決方案

  • open函數(shù)想以二進制模式打開文件,指定mode參數(shù)為'b'。
  • 二進制數(shù)據可以用fromfile(Python2中可以使用readinto),讀入到提前分配好的buffer中,便于數(shù)據處理。
  • 解析二進制數(shù)據可以使用標準庫中的struct模塊的unpack方法。

代碼演示

(1)struct.unpack方法簡單使用

# 以二進制形式打開文件
f = open('微信語音視頻.wav', 'rb')
# 讀取前44字節(jié)
info = f.read(44)
print(info)
 
import struct
 
'''
struct.unpack方法介紹:
    unpack(format, buffer)
    format:解析類型
    buffer:需要解析二進制串
    例: 構造兩個字節(jié)的二進制串,format默認為小端字節(jié)順序,
        h為16為,結果:2*256+1=513
        struct.unpack('h', b'\x01\x02')
        指定format為大端字節(jié)順序,結果:256+2=258
        struct.unpack('>h', b'\x01\x02')
'''
# print(help(struct.unpack))
# 解析聲道數(shù),Num Channels為22到24字節(jié)
print(struct.unpack('h', info[22:24]))
# 解析采樣頻率,SampleRate為24到28字節(jié),i為int類型
print(struct.unpack('i', info[24:28]))
# 編碼寬度,BitsPerSample為34到36字節(jié)
print(struct.unpack('h', info[34:36]))

(2)實現(xiàn)二進制文件wav的處理

# _*_ encoding:utf-8 _*_
import array
 
'''
讀取data數(shù)據部分不希望是字符串形式,因為字符串不支持數(shù)學運算,
對它不方便數(shù)據處理,最好讀取到類似于C語言中數(shù)組中去
'''
 
# 修改文件指針移動到文件末尾
f.seek(0, 2)
# 報告文件指針,也就是文件大小
print(f.tell())
# 數(shù)組的長度為文件字節(jié)長度減去44個字節(jié),除2為采樣寬度
n = (f.tell() - 44) // 2
 
# 創(chuàng)建數(shù)組,儲存data部分數(shù)據
buf = array.array('h', [])
 
# 將文件的數(shù)據讀入到buf當中,不返回字符串
f.seek(44)
buf.fromfile(f, n)
print(buf[0])
print(len(buf))
# 將采樣縮小一定程度,最終體現(xiàn)就是聲音變小
for i in range(n):
    buf[i] //= 8
# 將數(shù)據存入到一個新文件
f2 = open('demo.wav', 'wb')
f2.write(info)
buf.tofile(f2)
f2.close()

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

最新評論