Python:从二进制文件中提取奇怪的数字/与十六进制和十进制混淆

2024-06-16 13:17:07 发布

您现在位置:Python中文网/ 问答频道 /正文

这可能是极其微不足道的,如果是这样,我道歉,但我真的对我得到的输出感到困惑:hex?十进制的?什么?在

下面是一个示例,它返回的内容:

>>> 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大关附近,这让我相信我可能提取了一些奇怪的东西(比如hex,但我不认为是……)

结构如下(抱歉篇幅):

^{pr2}$

然后通过以下方法检索到上面的示例:

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

好的,再次抱歉,这是多么冗长,但这不仅仅是那些值,似乎有些值是可以的,有些不是,这使我相信较大的数字是以不同的方式编码的。。。我也不知道为什么所有的值都是成对的!在

裤子的问题,但如果有人有任何洞察力,将不胜感激。在


Tags: pos示例contentrxv2v1statehex
3条回答

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

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

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

不,输出不是十六进制的,是十进制的。我想你从二进制文件中读取的数据不正确。在

你可能会更喜欢下面这样的东西来阅读这个区块。在

如果您的数据没有正确解包,最可能的原因是头不是简单的2个长整数。或者,它可能没有反映你的平台的“endian-ness”。在

使用struct允许您向格式字符串添加“<;”或“>;”,以尝试不同的尾数。此外,您可以轻松地更改消息的格式,以使用普通的int或带符号的int或float,而无需太多实际工作。在

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),以更好地了解数据的实际外观。在

我发现这很容易做到numpy.fromfile文件在

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

相关问题 更多 >