在Python中解析来自128字节十六进制块的位

在Python中解析来自128字节十六进制块的位,python,parsing,hex,bit-manipulation,computer-science,Python,Parsing,Hex,Bit Manipulation,Computer Science,好吧,我现在处于一个有点奇怪的解析场景中,但现在它开始了 我有一个脚本,它读取需要解析的字节。我需要解析出这些字节,然后返回它们 例子 因此,我的脚本最终将能够输出与每行关联的十六进制数。现在,我需要说,好的,字节偏移量是0,获取第一个字节并返回十六进制。好的,字节偏移量是127-4,得到它,在屏幕上打印十六进制值 格式为127字节的十六进制,存储在字符串中 十六进制字符串 0x前缀已被剥离并存储到字符串中 本例中有很多零,但这只是一个随机情况。 字节偏移量可能会波动,所以我试图弄清楚如何基本上

好吧,我现在处于一个有点奇怪的解析场景中,但现在它开始了

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

例子 因此,我的脚本最终将能够输出与每行关联的十六进制数。现在,我需要说,好的,字节偏移量是0,获取第一个字节并返回十六进制。好的,字节偏移量是127-4,得到它,在屏幕上打印十六进制值

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

十六进制字符串 0x前缀已被剥离并存储到字符串中

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

我觉得奇怪的是,如果一个描述占用了这么多字节,那么按位操作就会变得更加困难,因为我无法将它们拆分为32位甚至64位的块

我想要什么 目前,我有一个字节偏移量数组,格式如下:

[0, 2-1, 3, 127-4]
我想遍历每个字节偏移量,从长十六进制字符串解析它们并打印它们

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

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

由于每个字节都是两个十六进制数字,因此您只需执行此操作即可获得十六进制字符串形式的字节:

string[start*2:(end+1)*2]
您需要执行
end+1
,因为在您的示例中,您的字节范围似乎是包含的,但是Python切片在范围的末尾是独占的

为了使这一点具体化,这里有一个简单的工作示例。您可能需要进行解析和按摩,以使您的范围看起来像我的范围,但这是一个想法:

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

那么您的问题是如何解析字节偏移量列表?或者如何使用这些从十六进制字节字符串中获取正确的字节?如何存储范围
2-1
是Python中的减法运算。他们的文档很奇怪,但实际上是2-1(包括2和1)@Ryan,StackOverflow是一个问答网站。读者,比如你自己,会问问题。其他读者试图回答这些问题。你的帖子组织得很好,你显然已经投入了一些精力。然而,它仍然缺少一个关键要素:一个问题。你有具体的问题要问吗?对不起,我正在尽我最大的努力来组织这个问题。我用一个更具体的例子更新了我的答案,你可以直接运行。希望这会对你有更多的帮助!知道最简单的方法将127-4的字符串拆分为逗号-sep列表吗?nvm,明白了吗it@Ryan
“127-4”。拆分(“-”)
Hm,我把它复杂化了。我在循环中查看每个字节偏移量。当它迭代时,我想在表单[(4127)]中添加'127-4',这样最终的数组看起来像上面的ranges示例,您的示例输出中也有一个小问题。位是以相反的顺序读取的,所以我不应该反转字符串吗?我从这个。。。可能有点偏离?[0,0]0x[2,1]0000[3,3]00[127,4]0000000000您的输入字符串显然以
0x
开头,但您问题中的示例输入字符串并非如此。如果您的实际数据有一个
0x
,或者如果您的实际数据是一个
int
而不是一个字符串,请更新您的问题。嗯,我正在处理的字符串是我上面标记为HEX string的块。这是一根绳子。
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]