从 Python 中的 128 字节十六进制块中解析位

Parsing bits from a 128 byte block of hex in Python

好的,所以我处于一个有点奇怪的解析场景中,但就是这样。

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

例子

-------------------------------------------------------------------
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,获取第一个字节并 return 十六进制。好的,字节偏移量是 127-4,去获取它,在屏幕上打印十六进制值。

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

十六进制字符串

100000000000000220000000000000003000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
0000000000000000

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

这个例子中有很多零,但这只是一个随机案例。 字节偏移量可能会波动,所以我试图弄清楚如何基本上遍历字节偏移量数组并逐步解析它们。

我觉得很奇怪,如果描述占用这么多字节,按位运算会变得更加困难,因为我无法将它们拆分成 32 位甚至 64 位块。

我想要的

目前我有一个字节偏移数组,格式如下:

[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
# Input: array of byte values
x='''
100000000000000220000000000000003000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000
0000000000000000
'''

# Input: list of offsets
o = ['0', '2-1', '3', '127-4']

# Put everything in a more useful format
x = ''.join(x.split())
o = [item.split('-') for item in o]
o = [[int(item) for item in pair] for pair in o]
for pair in o:
    if len(pair) == 1:
        pair.append(pair[0])

# Display the values
for pair in o:
    print pair, x[pair[1]*2:pair[0]*2+2]