1 回答

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊
看看 kaitai - https://kaitai.io/,這是一個(gè)用于跨多種語(yǔ)言解析二進(jìn)制文件的庫(kù),具有以獨(dú)立于語(yǔ)言的方式定義文件格式的框架。
它能夠在文件格式中定義條件,并根據(jù)需要調(diào)整解析。雖然學(xué)習(xí)曲線(xiàn)并非立即微不足道,但也不是太難。
假設(shè)您想自己做而不是使用外部庫(kù),則需要考慮一些可以提高性能/代碼的事情:
使用
struct.unpack_from(format, buffer, offset=0)
而不是當(dāng)前方法,因?yàn)?code>buffer[index : index + recordLength]可能會(huì)創(chuàng)建新對(duì)象并復(fù)制不需要的內(nèi)存如果你想解包相同格式的數(shù)組,你可以進(jìn)一步改進(jìn)它
struct.iter_unpack(format, buffer)
,然后迭代結(jié)果:
import itertools
import struct
def tryReadRecordsArrayFromBuffer(buffer, numRecords, format, fieldNames):
unpack_iter = struct.iter_unpack(buffer, format)
return [
# I like this better than dict(zip(...)) but you can also do that
{k: v for k, v in zip(fieldNames, vals)}
# We use `islice` to only take the first numRecords values
for vals in itertools.islice(unpack_iter, numRecords)
]
添加回答
舉報(bào)