当存在多个字节顺序时,Python struct.unpack(打包)?
我有一个函数,它读取二进制文件,然后使用struct.unpack()解包文件内容。我的函数运行得很好。如果/当我使用长“格式”字符串解包整个文件时,速度会更快。问题是,有时字节对齐方式会改变,所以我的格式字符串(无效)看起来像“llh”(这只是一个示例(它们通常要长得多))。有没有什么超灵巧的方法来处理这种情况?没有什么超灵巧的方法,但是如果速度很快,那么当存在多个字节顺序时,Python struct.unpack(打包)?,python,python-3.x,performance,binaryfiles,iterable-unpacking,Python,Python 3.x,Performance,Binaryfiles,Iterable Unpacking,我有一个函数,它读取二进制文件,然后使用struct.unpack()解包文件内容。我的函数运行得很好。如果/当我使用长“格式”字符串解包整个文件时,速度会更快。问题是,有时字节对齐方式会改变,所以我的格式字符串(无效)看起来像“llh”(这只是一个示例(它们通常要长得多))。有没有什么超灵巧的方法来处理这种情况?没有什么超灵巧的方法,但是如果速度很快,那么struct模块的顶级函数就是包装器,必须重复检查缓存中与格式字符串对应的实际struct.struct实例;虽然您必须创建单独的格式字符串
struct
模块的顶级函数就是包装器,必须重复检查缓存中与格式字符串对应的实际struct.struct
实例;虽然您必须创建单独的格式字符串,但可以通过避免重复的缓存检查来解决部分速度问题
而不是做:
buffer = memoryview(somedata)
allresults = []
while buffer:
allresults += struct.unpack_from('<10sHHb', buffer)
buffer = buffer[struct.calcsize('<10sHHb'):]
allresults += struct.unpack_from('>llh', buffer)
buffer = buffer[struct.calcsize('>llh'):]
将为您提供一个结构,使您能够:
mystruct = MainStruct()
memoryview(mystruct).cast('B')[:] = bytes(range(25))
然后您将按预期顺序获得结果,例如:
>>> hex(mystruct.b[0]) # Little endian as expected in main struct
'0xb0a'
>>> hex(mystruct.big.x[0]) # Big endian from inner big endian structure
'0xf101112'
虽然在某种程度上很聪明,但它很可能会运行得更慢(ctypes
属性查找在我的经验中速度非常慢),而且与struct
模块函数不同,您不能在一行中解压成顶级命名变量,它始终是属性访问
mystruct = MainStruct()
memoryview(mystruct).cast('B')[:] = bytes(range(25))
>>> hex(mystruct.b[0]) # Little endian as expected in main struct
'0xb0a'
>>> hex(mystruct.big.x[0]) # Big endian from inner big endian structure
'0xf101112'