[英]Parsing bits from a 128 byte block of hex in Python
好的,所以我处于一种奇怪的解析场景中,但是就这样了。
我有一个脚本读取需要解析的字节。 我需要解析出这些字节,然后将其返回。
-------------------------------------------------------------------
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位的块。
目前,我有以下形式的字节偏移数组:
[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
# 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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.