Python;结构;24位整数的重复计数
我想把一个2760字节的数组拆分成一个新的数组,这个新数组里有920个24位的整数。跟16位整数不一样,比如用struct.unpack_from('920h',array,0)
就能搞定,但对于24位整数,你不能用'重复计数'的语法:
struct.unpack_from('920<i', array,0 )
这样做会出现一个错误:'结构格式中的计数不正确'。
那么,24位整数的语法应该是什么呢?我在文档里找不到相关的信息。
1 个回答
2
struct
本身不支持 24 位整数。
如果这些是 无符号 整数,你可以用一个小技巧,使用 array.array()
类型 来把数据当作字节读取,然后每三字节处理一次:
import array
b = array.array('B', yourdata)
result = [b[i] << 16 | b[i + 1] << 8 | b[i + 2] for i in xrange(0, len(b), 3)]
或者你可以使用 array.fromfile()
从文件中按需读取数据:
with open('somefilename', 'rb') as infh:
b = array.array('B')
b.fromfile(infh, 920)
result = [b[i] << 16 | b[i + 1] << 8 | b[i + 2] for i in xrange(0, len(b), 3)]
根据需要调整字节顺序(交换 b[i]
和 b[i + 2]
的位置)。
如果这些是 有符号 的 24 位整数,你可能需要坚持使用 struct
,并在 最低有效位 处填充一个空字节,然后将结果右移 8 位。这样你就不需要担心负数和正数,以及如何在最高有效位填充这两种类型:
[struct.unpack('>i', yourdata[i:i+3] + '\x00')[0] >> 8
for i in range(0, len(yourdata), 3)]
对于大端字节序,和
[struct.unpack('<i', '\x00' + yourdata[i:i+3])[0] >> 8
for i in range(0, len(yourdata), 3)]
对于小端字节序的有符号 24 位整数。
如果你使用的是 Python 3.2 或更新版本,你可以每次读取 3 个字节,并使用 int.from_bytes()
转换为整数,这样你在处理字节序和解析有符号或无符号整数时会更灵活。