我有一个二进制文件,当我用python解析它时,内容将如下所示:
b'x00x20x00x2Ax02x01'
数据成对呈现,实际上字符串将表示为字节数组。我将有效地处理二进制数据。在上述示例中,有 3 对 (x00x20 x00x2A x02x01
)。我想更改输入文件,然后将其写入二进制文件。更改如下: 在每对中,如果第 1 项为 0,则第 2 项将位于输出文件中。如果第 1 项为 1,则前一项对中的第 2 项将位于输出文件中。如果第 1 项大于 1,则它会更复杂。这将取决于同一对中的 2 个项目。例如 1,如果第 1 项为 2,第 2 项为 1,为了获取输出的数字,程序将 2 项返回到输出中,并将该项用作输出。
示例 2:如果第 1 项为 2,第 2 项为 2,则为了获取输出的数字,程序在输出中返回 2 项,并使用该项加上之后的 1 项作为输出。
以下是预期的输出:
b'x20x2Ax20'
我尝试在python中使用以下代码:
data = b'x00x20x00x2Ax02x01'
out = bytearray()
for i in range(len(data)):
if i % 2 !=0:
if data[i] ==0:
out.append(data[i+1])
elif data[i] ==1:
out.append(data[i-1])
elif data[i] >1:
n = data[i]
for j in range(n):
out.append(n[0:j])
但它没有返回预期的输出。 由于我在处理二进制文件方面很陌生,你能帮我修复它吗? 或者给我一些技巧来获得这样的输出?
你没那么远。首先,range
允许自动仅使用每个第 n 项及其 step 参数,因此您可以使用:
for i in range(0,len(data),2):
接下来,最后一个块与您的文本不一致:
n = data[i]
for j in range(n): # according to your text, it should be n = data[i+1]
out.append(n[0:j]) # non sensible expression: n is an integer
要获取预期数据,应使用:
n = data[i+1]
for j in range(n):
out.append(data[i-3+2*j])
但请注意,此代码盲目地相信data
输入是正确的,如果操作需要不存在的字节,则会引发 KeyError。
首先,如果你想对每对的第一项做出决定,你应该检查i % 2 == 0
否则data[i]
将永远是你的对的第二项。这是因为计数器从 0 开始。
您会收到错误消息,因为您的n
是int
,因此您不能对其使用切片([]
运算符)。
此外,您的data[i] > 1
代码根本不适合您在示例中描述的内容,因为您想返回输出。
它更像是:
data = b'x00x20x00x2Ax02x01'
out = bytearray()
for i in range(len(data)):
if i % 2 == 0:
if data[i] == 0:
out.append(data[i+1])
elif data[i] == 1:
out.append(data[i-1])
elif data[i] > 1:
n = data[i]
for j in range(n):
out.append(out[-2]) # take the item 2 steps back from the end of "out"
out
将是一个值为[32, 42, 32, 42]
的字节数组,即使print(out)
将输出bytearray(b' * *')
但请记住,正如 @Serge Ballesta 在他的回答中已经说过的那样:您的程序完全相信data
格式正确,如果不是,当索引不够大时,您会遇到out
超出范围的问题out[-2]
.