【问题标题】:Unpack binary data with python用python解压二进制数据
【发布时间】:2012-11-04 07:02:48
【问题描述】:

我想用 Python 将一个二进制数据数组解压为 uint16 数据。

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

大部分示例如下(B 是来自文件的二进制数组)

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

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

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

有效。

但是如果我想解压一个大小为L 的数组(L 是对)怎么办? 我试过了:

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 的二进制数组,我将不胜感激

【问题讨论】:

  • 最好是复制粘贴。我认为您的示例不起作用:字符串索引适用于[],而不适用于()。那么你到底是做什么的呢?
  • 你检查过B 的长度吗?它可能没有512字节吗?
  • 打印len(B),它可能会发光。
  • struct.unpack_from("H", B) 不起作用?也许你需要写: struct.unpack_from("%dH"%(len(B)/2), B)
  • B[0:446] == B[0:444] if len(B) is 444. Past 444 your string is too short.

标签: python arrays struct unpack uint16


【解决方案1】:

使用 array.fromstring 或 array.fromfile(参见http://docs.python.org/2/library/array.html):

import array
U = array.array("H")
U.fromstring(B)

【讨论】:

    【解决方案2】:

    如果要从二进制数据中解压缩 n 个元素,请指定元素的数量以及数据类型。对于 n=999:

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

    【讨论】:

      【解决方案3】:

      同一事物的可变长度版本:

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

      【讨论】:

        猜你喜欢
        • 2020-11-11
        • 2014-11-12
        • 1970-01-01
        • 2010-09-17
        • 1970-01-01
        • 1970-01-01
        • 2020-02-03
        • 2021-06-11
        • 1970-01-01
        相关资源
        最近更新 更多