import sys
def XoR(filename, operand):
byte = bytearray(1024)
with open(filename, "rb") as file:
reAd = file.readinto(byte)
while True:
reAd = file.readinto(byte)
for i in range(reAd):
byte[i] ^= operand
sys.stdout.buffer.write(byte)
def main():
return XoR(sys.argv[1], int(sys.argv[2]))
if __name__ == '__main__':
main()
我不确定如何修改代码,以使输出的字节总数与输入文件中的字节总数完全相同。 根据我的代码,输出为1024的倍数,即缓冲区的初始大小。 我该怎么办,以便它在最后一块而不是整个缓冲区中输出相关字节?我应该创建一个条件来处理最后一个块吗?
答案 0 :(得分:1)
选项1::仅将与返回的readinto
操作相同的字节写回文件。
sys.stdout.buffer.write(byte[:reAd])
选项2:不要使用readinto
。
def XoR(filename, operand):
with open(filename, "rb") as file:
while True:
chunk = file.read(1024)
if not chunk:
break
chunk = bytes(byte ^ operand for byte in chunk)
sys.stdout.buffer.write(chunk)