使用Python解包二进制数据

14

我想使用Python将二进制数据数组解包为uint16数据。

互联网上充满了使用struct.unpack的示例,但只有处理大小为4的二进制数组的示例。

其中大多数示例如下(B是来自文件的二进制数组)

U = struct.unpack("HH",B[0:4]);

所以我尝试解包一个大小为6的数组:

U = struct.unpack("HHH",B[0:6]);

它有效。

但是如果我想要解包一个大小为LL为一对数)的数组,该怎么做? 我尝试过这样:

U = struct.unpack("H"*(L/2),B[0:L]);

但是它无法工作,提示器给了我一个错误(例如对于L=512):

struct.error: unpack requires a string argument of length 512

这条信息很奇怪,因为如果我想要将一个二进制数组解包为 uint16 类型,我需要一个长度为数组一半的字符串 "HHH...HHH"

如果有人能够提供帮助,我将非常感激。


我有一点进展了…实际上,我尝试了:

U = struct.unpack("H"*8,B[0:8]); 

它起作用了。

U = struct.unpack("H"*10,B[0:10]);

它有效。

U = struct.unpack("H"*222,B[0:444]);

它仍然可用

U = struct.unpack("H"*223,B[0:446]);

它不起作用!而且对于大于446的尺寸永远不起作用。

希望这会帮助任何人回答我的问题。


@MarkRansom 我检查了len(B),实际长度确实是444。我非常确定B是一个大小为512的数组,因为B来自于:B = f.read(512)其中F是一个8000字节大小的文件。所以问题出在read()上……感谢您的回答!但如果有人能帮忙解包大小为L的二进制数组,我将不胜感激。


最好你能够复制粘贴。我认为你的例子不起作用:字符串索引使用[],而不是()。那么你真正想做什么? - glglgl
你有检查过 B 的长度吗?它有可能不是512个字节吗? - glglgl
4
打印len(B),这将很有启发性。 - Mark Ransom
struct.unpack_from("H", B)不能正常工作?也许你需要写成:struct.unpack_from("%dH"%(len(B)/2), B)。 - emil
如果B的长度为444,则B[0:446] == B[0:444]。超过444,你的字符串就太短了。 - engineerC
file.read()文档中:*"从文件中最多读取size字节(如果在获取size字节之前读取到EOF,则读取的字节数会更少)"。* 也就是说,f.read(512)可能返回少于512字节。 - jfs
3个回答

13

9

同样的事情的可变长度版本:

n = 999
U = struct.unpack(str(n)+"H", B)

5
如果您想从二进制数据中解压出n个元素,则需要指定元素数量以及数据类型。例如,当n=999时:
U = struct.unpack("999H", B)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接