如何操作二进制文件并将结果写入另一个二进制文件



我有一个二进制文件,当我用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 开始。

您会收到错误消息,因为您的nint,因此您不能对其使用切片([]运算符)。

此外,您的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].

最新更新