从Python2移植到Python3写入二进制文件时向字符串添加字节

从Python2移植到Python3写入二进制文件时向字符串添加字节,python,python-3.x,python-2.7,encryption,Python,Python 3.x,Python 2.7,Encryption,作为我的第一个Python项目,我正在尝试将一个解密工具从Python2移植到Python3,这将解密一系列文件 Python2的原始代码如下所示: decrypted = '' for i in xrange(len(content)): keybytenum = i & 0xF xorbytenum = i & 0x1FF contentbyte = ord(key[keybytenum:keybytenum + 1]) ^ ord(xortable

作为我的第一个Python项目,我正在尝试将一个解密工具从Python2移植到Python3,这将解密一系列文件

Python2的原始代码如下所示:

decrypted = ''

for i in xrange(len(content)):
    keybytenum = i & 0xF
    xorbytenum = i & 0x1FF
    contentbyte = ord(key[keybytenum:keybytenum + 1]) ^ ord(xortable[xorbytenum:xorbytenum + 1]) ^ ord(content[i:i + 1])
    decrypted += chr(contentbyte)

fd = open(base + 'decrypted' + os.path.sep + 'CONTENT.DAT', 'wb')
fd.write(decrypted)
fd.close()
xrange
更改为
range
后,我在写入文件时出现以下错误(
fd.write(已解密)
):
TypeError:需要类似字节的对象,而不是'str'

然后我试着换衣服
decrypted=''
to
decrypted=b'
但随后在
decrypted+=chr(contentbyte)
中收到一个错误,表示
TypeError:无法将str连接到字节

我无法将
contentbyte
的值更改为bytes,以便将其附加到
decrypted
中,因此后来我尝试将
decrypted
更改回字符串,并通过对
decrypted
的值进行如下编码来写入文件
fd.write(decrypted.encode('ascii',errors='replace'))
。这允许程序运行,但输出与Python2不同,这让我用
b''包装字符串。

如果我做一个
.decode('utf-8')
字符串看起来不错,但是我得到了很多不好的输出,在十六进制编辑器中,我得到了很多
3F
值,其中Python2将有不同的值

我不知道该试什么了。有人对下一步该试什么有什么建议吗?任何帮助都将不胜感激

编辑:

尝试了更多的东西,但没有任何效果:

decrypted += contentbyte  # TypeError: can't concat int to bytes

decrypted += contentbyte.to_bytes(1, 'big', signed=False)  # Hangs

decrypted += contentbyte.to_bytes(1, 'little', signed=False)  # Hangs

decrypted += struct.pack("B", contentbyte)  # Hangs

decrypted += six.int2byte(contentbyte)  # Hangs

decrypted += bytes(contentbyte)  # Hangs

decrypted += bytes([contentbyte])  # Hangs
不知道下一步该做什么

编辑2:

我再次尝试了一种我认为挂起的方法,但结果证明它确实起作用了,只是非常缓慢!在python3中花了大约30分钟,但它起作用了,我得到了与python2代码相同的输出。然而,python2版本大约需要5秒

有人对我如何加快速度有什么想法吗

编辑3:

终于很快实现了这一点,以下是最终的效果:

decrypted = ''

for i in range(len(content)):
    keybytenum = i & 0xF
    xorbytenum = i & 0x1FF
    contentbyte = ord(key[keybytenum:keybytenum + 1]) ^ ord(xortable[xorbytenum:xorbytenum + 1]) ^ ord(content[i:i + 1])
    decrypted += chr(contentbyte)

fd = open(base + 'decrypted' + os.path.sep + 'CONTENT.DAT', 'wb')
fd.write(bytes(decrypted, encoding="raw_unicode_escape"))
fd.close()

这段代码有点难看,因为它处理字符串,然后转换为字节,但至少转换只进行一次,而不是循环,导致代码在几秒钟内完成,而不是像以前的尝试那样在30分钟内完成。

当您将
解密
更改为
b'
时,您做得很好,但是您尝试附加字符串,这(如您所知)不起作用。因此,不要使用
chr(contentbyte)
-将其更改为
str
,仅附加
contentbyte
,顾名思义,它应该是
bytes
类型,而不是
str
,感谢您的回复!我确实尝试过,但是,contentbyte的结果实际上是
int
,而不是
byte
,它给出了一个
类型错误:无法解析int-to-bytes
。我尝试了一个
解密+=six.int2byte(contentbyte)
和一些其他转换方法,但它只是挂起了,我尝试了一些其他方法,但没有用
#解密+=contentbyte#类型错误:无法将int-to-bytes
#解密+=contentbyte.to#u字节(1,'big',signed=False)挂起
#解密+=contentbyte.to#u字节(1,'little',signed=False)#挂起
#解密+=struct.pack(“B”,contentbyte)#挂起
#解密+=6.int2byte(contentbyte)#挂起
#解密+=bytes(contentbyte)##挂起
不确定要尝试什么。变量名误导了nextI。请尝试以下操作:
解密+=chr(contentbyte)。encode('utf-8'))
Hi@yedpodtrzitko我认为这也可以,有点像我发布的方法。它们可以工作,但需要很长的时间才能完成。似乎在循环中转换为字节是很昂贵的。在尝试了更多的事情之后,我最终通过将
解密的
变量改回字符串和这一行:
fd.write,使它工作得很快(bytes(decrypted,encoding=“raw\u unicode\u escape”)
这很难看,因为我将变量保留为字符串而不是字节,我将用最后的代码编辑我的原始帖子。它看起来确实有点难看,所以如果你有建议,我很乐意接受!