【问题标题】:Python - Search for hex value marker and extract dataPython - 搜索十六进制值标记并提取数据
【发布时间】:2013-06-22 05:51:21
【问题描述】:

我是 python 新手,并在发布之前尝试过寻求帮助。

我有一个包含许多我需要解析的值的二进制文件。每个值都有一个包含两个字节的十六进制标头和第三个字节,它给出了该记录中要解析的数据的大小。下面是一个例子:

\x76\x12\x0A\x08\x00\x00\x00\x00\x00\x00\x00\x00

\x76\x12 是记录标记,\x0A 是接下来要读取的字节数。

此数据始终具有两个字节标记和第三个字节大小。但是要解析的数据是可变的,记录标记按如下方式递增:\x76\x12\x77\x12 依此类推,直到 \x79\x12 再次开始。

这只是使用此帖子的示例数据。

非常感谢您的帮助或指点。

【问题讨论】:

  • 十六进制值是否总是用反斜杠分隔?
  • 这是真正的字符串内容还是它的 Python 表示形式?

标签: python parsing binary hex


【解决方案1】:

这会将数据视为原始字符串(忽略“\”转义字符并拆分为列表

a = r"\x76\x12\x0A\x08\x00\x00\x00\x00\x00\x00\x00\x00".split('\\')
print a

输出:['','x76','x12','x0A','x08','x00','x00','x00','x00','x00','x00',' x00', 'x00']

然后,您可以遍历您感兴趣的值,并在需要时将它们转换为十进制:

for i in range(len(a[4:])): # cutting off records before index 4 here
    print int(str(a[i+4][1:]),16)

【讨论】:

    【解决方案2】:

    你想要这样的东西吗?

    >>> b = b'\x76\x12\x0A\x08\x00\x00\x00\x00\x00\x00\x00\x00'
    >>> from StringIO import StringIO
    >>> io = StringIO(b)
    >>> io.seek(0)
    >>> io.read(2) #read 2 bytes, maybe validate?
    'v\x12'
    >>> import struct
    >>> nbytes = struct.unpack('B',io.read(1))
    >>> print nbytes
    (10,)
    >>> data = io.read(nbytes[0])
    >>> data
    '\x08\x00\x00\x00\x00\x00\x00\x00\x00'
    

    【讨论】:

    • 就个人而言,我只是使用nbytes = ord(io.read(1)),而不是在这里使用struct 模块。
    猜你喜欢
    • 2014-02-18
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 2016-04-09
    • 2022-01-25
    相关资源
    最近更新 更多