第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Python:從二進(jìn)制數(shù)據(jù)中解壓結(jié)構(gòu)數(shù)組的最佳方法是什么

Python:從二進(jìn)制數(shù)據(jù)中解壓結(jié)構(gòu)數(shù)組的最佳方法是什么

婷婷同學(xué)_ 2023-01-04 16:14:32
我正在解析二進(jìn)制文件格式(OpenType 字體文件)。該格式是許多不同結(jié)構(gòu)類(lèi)型的復(fù)雜樹(shù),但一個(gè)重復(fù)出現(xiàn)的模式是具有特定格式的記錄數(shù)組。我已經(jīng)編寫(xiě)struct.unpack了用于一次獲取一條記錄的代碼。但我想知道是否有一種方法可以解析整個(gè)記錄數(shù)組?以下是一種特定記錄數(shù)組的解壓縮結(jié)果示例:[{'glyphID': 288, 'paletteIndex': 0}, {'glyphID': 289, 'paletteIndex': 1}, {'glyphID': 518, 'paletteIndex': 0}, ...]    list這就是我目前正在做的事情:我創(chuàng)建了一個(gè)通用函數(shù)來(lái)解壓縮任意記錄數(shù)組(在任何給定調(diào)用中的記錄格式一致)。def tryReadRecordsArrayFromBuffer(buffer, numRecords, format, fieldNames):    recordLength = struct.calcsize(format)    array = []    index = 0    for i in range(numRecords):        record = {}        vals = struct.unpack(format, buffer[index : index + recordLength])        for k, v in zip(fieldNames, vals):            record[k] = v        array.append(record)        index += recordLength    return array該buffer參數(shù)是一個(gè)字節(jié)序列,大小至少為數(shù)組的大小,第一個(gè)記錄在序列的開(kāi)頭被解包。根據(jù)正在讀取的記錄數(shù)組的類(lèi)型,format參數(shù)是格式字符串。struct在一種情況下,格式字符串可能是">3H";在另一種情況下,它可能是">4s2H";等。對(duì)于上面的結(jié)果示例,它是">2H"。該fieldNames參數(shù)是給定記錄類(lèi)型中字段名稱(chēng)的字符串序列。對(duì)于上面的結(jié)果示例,這是("glyphID", "paletteIndex").因此,我正在遍歷緩沖區(qū)(字節(jié)序列數(shù)據(jù)),獲取順序切片并一次一個(gè)地解壓縮記錄,為每條記錄創(chuàng)建一個(gè)字典并將它們附加到array列表中。有沒(méi)有更好的方法來(lái)做到這一點(diǎn),比如unpack某些模塊中的方法允許將格式定義為結(jié)構(gòu)數(shù)組并立即解壓整個(gè) shebang?
查看完整描述

1 回答

?
慕絲7291255

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ù),則需要考慮一些可以提高性能/代碼的事情:

  1. 使用struct.unpack_from(format, buffer, offset=0)而不是當(dāng)前方法,因?yàn)?code>buffer[index : index + recordLength]可能會(huì)創(chuàng)建新對(duì)象并復(fù)制不需要的內(nèi)存

  2. 如果你想解包相同格式的數(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)

    ]


查看完整回答
反對(duì) 回復(fù) 2023-01-04
  • 1 回答
  • 0 關(guān)注
  • 116 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)