【问题标题】:Python: strange numbers being pulled from binary file /confusion with hex and decimalsPython:从二进制文件中提取的奇怪数字/与十六进制和小数混淆
【发布时间】:2011-01-10 01:12:32
【问题描述】:

这可能非常微不足道,如果是这样,我很抱歉,但我对我得到的输出感到非常困惑:十六进制?十进制?什么?

这是一个例子,它返回了什么:

>>> print 'Rx State: ADC Clk=', ADC_Clock_MHz,'MHz DDC Clk=', DDC_Clock_kHz,'kHz Temperature=', Temperature,'C'
Rx State: ADC Clk= [1079246848L, 0L] MHz DDC Clk= [1078525952L, 0L] kHz Temperature= [1078140928L, 0L] C

现在我承认这是轻微的猜测,因为我不确切知道数据是什么 - 我有一个关于如何从文件中解析出来的规范,但它给了我非常奇怪的答案。

如您所见 - 值非常相似,都在 1078000000 标记附近,这让我相信我可能会提取一些奇怪的东西(比如十六进制,但我不认为它是......)

结构如下(见长见谅):

#Read block
    more = 1
    while(more == 1):
        a = array.array("L")
        a.fromfile(wholeFile,2)
        if len(a) == 2:
            structure_id = a[0]
            print 'structure_id: ', hex(structure_id)
            structure_length = a[1]
            print 'structure_length: ', structure_length
        else:
            print 'cannot read structure start'

        numDwords = (structure_length/4) - 2 - 1;
        print 'numDwords: ', numDwords

        content = array.array("L")
        content.fromfile(wholeFile,numDwords)
        if len(content) != numDwords:
            print 'cannot read structure'
            more = 0
            ok = 0

然后上面的例子是通过以下方式检索到的:

pos = 2
v1 = [content[pos+1], content[pos]]
pos = pos+2
v2 = [content[pos+1], content[pos]]
pos = pos+2
v3 = [content[pos+1], content[pos]]
pos = pos+2

ADC_Clock_MHz = v1
DDC_Clock_kHz = v2
Temperature = v3

再次抱歉,这是多么冗长,但不仅仅是那些值,似乎有些值可以,有些则不行,这让我相信更大的数字编码不同......我也没有明白为什么所有的值都是成对的!

裤子问题,但如果有人有任何见解,将不胜感激。

【问题讨论】:

    标签: python binary numpy hex


    【解决方案1】:

    内容是成对的,因为您将一对分配给变量(例如ADC_Clock_MHz = v1 和v1 = [content[pos+1], content[pos]])。

    您基本上是将两个元素的列表分配给v1,其中第一个元素是数组content 中索引pos+1 中的元素,第二个元素是索引pos 中的元素数组content。

    我有点困惑你为什么要构建这两个元素的列表。您是否试图将这两个元素组合成一个数字?如果可以的话,我认为你需要告诉我们更多关于文件格式的信息。这是作业吗?

    不,输出不是十六进制,而是十进制。我认为您从二进制文件中读取数据不正确。

    【讨论】:

    • 好的,看来我读错了。我知道它们是成对的,并且我已经以这种方式分配了数据。我只是不知道为什么这些数据中的每一个数据都有一对值。奇怪的。我正在创建的 2 个元素的列表最终会放入 numpy 数组中。我实际上是从 Matlab 翻译这段代码,但进展不太顺利。
    【解决方案2】:

    您可能会更喜欢以下内容来阅读此块。

    如果您的数据未正确解包,最可能的原因是标头不是简单的 2 个长整数。或者,可能无法反映您平台的“字节序”。

    使用struct 允许您在格式字符串中添加“”来尝试不同的字节序。此外,您可以轻松更改消息格式以使用普通整数或带符号整数或浮点数,而无需进行太多实际工作。

    import struct
    def read( someFile ):
        header= someFile.read( 8 )
        id, length = struct.unpack( "LL", header )
        print id, length
        body = someFile.read( length-8 ) # Common for length to include the header
        words = (length-8)//4
        content= struct.unpack( "L"*words, body )
    

    您还可以打印 repr(header) 和 repr(body) 以尝试更好地了解您的数据的实际外观。

    【讨论】:

    • 奇怪,如果我在 IDLE 中运行该代码,我会在最后一行得到 MemoryError(我想一定是数据太多)。但是当我在 Netbeans 上运行它时:'id, length = struct.unpack("LL", header)' 我得到这个错误:'struct.error: unpack requires a string argument of length 16'
    • 奇怪,缺少文件,我猜。很明显,我猜错了。 L 一定是 8 字节长。您可以通过阅读struct 的文档来确认这一点。你有两个选择。标头是 8 字节还是 16 字节?如果 8 使用不同的格式,可能是“II”。如果为 16,则读取 16 个字节而不是 8 个。
    【解决方案3】:

    发现使用 numpy.fromfile 非常容易做到这一点

    指定要提取的内容(例如 uint32、int16 等)并将其提取为数组。 您甚至可以将自己的类型指定为现有类型的集合,这意味着您可以一次性提取已知结构(例如,2 个 uint32s 然后 1 个字符串然后 5 个 int16s 作为 8 个值的数组)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-08
      • 2014-02-18
      • 1970-01-01
      • 2020-01-10
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      相关资源
      最近更新 更多