python - 在 Python 中解析 128 字节十六进制 block 中的位

标签 python parsing hex bit-manipulation computer-science

好吧,我正处于一个有点奇怪的解析场景中,但事情就这样了。

我有一个脚本,可以读取需要解析的字节。我需要解析出这些字节然后返回它们。

示例

-------------------------------------------------------------------
Description: Log Parameters   : Byte Offset:  0
-------------------------------------------------------------------
-------------------------------------------------------------------
Description: Offset           : Byte Offset:  2-1
-------------------------------------------------------------------
-------------------------------------------------------------------
Description: Request Count    : Byte Offset:  3
-------------------------------------------------------------------
-------------------------------------------------------------------
Description: Reserved         : Byte Offset:  127-4
-------------------------------------------------------------------

所以我的脚本最终将能够输出与每行相关的十六进制。现在,我需要说,好吧,字节偏移量为 0,获取第一个字节并以十六进制返回它。好的,字节偏移量是 127-4,去获取它,在屏幕上打印十六进制值。

格式为存储在字符串中的 127 字节十六进制。

十六进制字符串

100000000000000220000000000000003000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
0000000000000000

0x 前缀已被剥离并存储到字符串中。

此示例中有很多零,但这只是随机情况。 字节偏移量可能会波动,因此我试图弄清楚如何基本上迭代字节偏移量数组并增量解析它们。

对我来说很奇怪的是,如果一个描述占用了这么多字节,按位运算就会变得更加困难,因为我无法将它们分成 32 位甚至 64 位 block 。

我想要什么

目前我有一个以下形式的字节偏移数组:

[0, 2-1, 3, 127-4]

我想迭代每个字节偏移量,从长十六进制字符串中解析它们并打印它们。

问题

如何使用数组中的字节偏移量并将它们从十六进制字符串中解析出来。

最佳答案

假设起始字节#存储在start变量中,结束字节#存储在end变量中,然后十六进制字符串存储在string中 变量。

由于每个字节都是两个十六进制数字,因此您可以简单地执行以下操作来获取十六进制字符串形式的字节:

string[start*2:(end+1)*2]

您需要执行end+1,因为您的示例中似乎包含字节范围,但Python 切片在范围末尾是排除的。 More on slicing if you're unfamiliar.

为了让您更具体地了解这一点,这里有一个最小的工作示例。您可能必须进行解析和调整才能使您的范围看起来像我的,但这就是想法:

string = "100000000000000220000000000000003000000000000000" \
         "000000000000000000000000000000000000000000000000" \
         "000000000000000000000000000000000000000000000000" \
         "000000000000000000000000000000000000000000000000" \
         "000000000000000000000000000000000000000000000000" \
         "0000000000000000"

ranges = ['0', '2-1', '3', '127-4']

for offset in ranges:
    offset_list = offset.split('-')
    if len(offset_list) == 1:
        start = int(offset_list[0])
        end = int(offset_list[0])
    else:
        start = int(offset_list[1])
        end = int(offset_list[0])
    the_bytes = string[start*2:(end+1)*2]
    print('%d-%d: %s' % (start, end, the_bytes))

输出:

0-0: 10
1-2: 0000
3-3: 00
4-127: 00000002200000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

关于python - 在 Python 中解析 128 字节十六进制 block 中的位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31440326/

相关文章:

python - Matplotlib 副标题打印在旧副标题上

C++ 从一个大文件中解析一行

parsing - 固定并恢复.bnf中的内容(解析)

c# - 在 C# 中从十六进制到整数的错误转换

python - 多个输出和 numba 签名

Windows 上的 Python GTK CSS 问题

java - Java中的十六进制整数到十进制整数

c++ - 将 0A 替换为\n

python - 使用 Python 正则表达式在文件中查找函数调用的正则表达式?

java - 如何在Java中解析css文件