gpt4 book ai didi

python - 在 Python 中读取和写入二进制文件

转载 作者:太空狗 更新时间:2023-10-29 21:07:39 26 4
gpt4 key购买 nike

以下代码似乎无法正确读取/写入二进制形式。它应该读取一个二进制文件,对数据进行按位异或并将其写回文件。没有任何语法错误,但数据未验证,我已通过其他工具测试源数据以确认异或 key 。

更新:根据评论中的反馈,这很可能是由于我正在测试的系统的字节顺序。

xortools.py :

def four_byte_xor(buf, key):
out = ''
for i in range(0,len(buf)/4):
c = struct.unpack("=I", buf[(i*4):(i*4)+4])[0]
c ^= key
out += struct.pack("=I", c)
return out

调用 xortools.py:

from xortools import four_byte_xor
in_buf = open('infile.bin','rb').read()
out_buf = open('outfile.bin','wb')
out_buf.write(four_byte_xor(in_buf, 0x01010101))
out_buf.close()

看来我需要根据 answer 读取字节.当上面的函数操作多个字节时,上面的函数将如何合并到下面的函数中?还是无所谓?我需要使用 struct 吗? ?

with open("myfile", "rb") as f:
byte = f.read(1)
while byte:
# Do stuff with byte.
byte = f.read(1)

例如,以下文件有 4 个重复字节,01020304:

before XOR

数据与 key 01020304 进行异或运算,将原始字节归零:

after XOR

这是对原始函数的尝试,在这种情况下 05010501 是不正确的结果:

incorrect XOR attempt

最佳答案

这是一个相对简单的解决方案(已测试):

import sys
from xortools import four_byte_xor
in_buf = open('infile.bin','rb').read()
orig_len = len(in_buf)
new_len = ((orig_len+3)//4)*4
if new_len > orig_len:
in_buf += ''.join(['x\00']*(new_len-orig_len))
key = 0x01020304
if sys.byteorder == "little": # adjust for endianess of processor
key = struct.unpack(">I", struct.pack("<I", key))[0]
out_buf = four_byte_xor(in_buf, key)
f = open('outfile.bin','wb')
f.write(out_buf[:orig_len]) # only write bytes that were part of orig
f.close()

它所做的是将数据的长度填充到 4 字节的整数倍,与四字节 key 进行异或运算,但随后只写出原始长度的数据。

这个问题有点棘手,因为 4 字节 key 的数据字节顺序取决于您的处理器,但总是先写高字节,但字符串或字节数组的字节顺序总是写低-byte 首先显示在您的十六进制转储中。为了允许将 key 指定为十六进制整数,有必要添加代码以有条件地补偿不同的表示形式——即允许 key 的字节可以按照与十六进制转储中出现的字节相同的顺序指定。

关于python - 在 Python 中读取和写入二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11462466/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com