【发布时间】:2020-10-03 10:55:14
【问题描述】:
我正在尝试使用 Qt 库(python 中的 Pyside2)将一些函数从 C++ 传递到 Python。目前一切正常,将代码从一侧传递到另一侧并使其适应 Python,但是当我开始处理一些文件“翻译”时,我得到了不同的结果,有时还会出现错误。
我应该得到这个:
但我得到了这个:
或者我将每个字节添加到数组 chr() 我得到这个:
我是一个处理字节和字节数组的新手,所以我不知道我是否必须保存从解码算法中获得的每个结果,或者我是否必须保存字节数组中的每个字节,然后在它解码时解码它完成了。如果尝试最后一个选项,我会在此部分中收到“溢出”错误decryptedFile.append(currentByte ^ 0x33)
我想修复此代码以使其正常工作。谢谢大家!
这是 C++ 中的原始函数:
QByteArray NosTextDatFileDecryptor::decrypt(QByteArray &array) {
QByteArray decryptedFile;
int currIndex = 0;
while (currIndex < array.size()) {
unsigned char currentByte = array.at(currIndex);
currIndex++;
if (currentByte == 0xFF) {
decryptedFile.push_back(0xD);
continue;
}
int validate = currentByte & 0x7F;
if (currentByte & 0x80) {
for (; validate > 0; validate -= 2) {
if (currIndex >= array.size())
break;
currentByte = array.at(currIndex);
currIndex++;
int firstByte = cryptoArray.at((currentByte & 0xF0) >> 4);
decryptedFile.push_back(firstByte);
if (validate <= 1)
break;
int secondByte = cryptoArray.at(currentByte & 0xF);
if (!secondByte)
break;
decryptedFile.push_back(secondByte);
}
} else {
for (; validate > 0; --validate) {
if (currIndex >= array.size())
break;
currentByte = array.at(currIndex);
currIndex++;
decryptedFile.push_back(currentByte ^ 0x33);
}
}
}
return decryptedFile;
}
这是我的项目 Python 版本的代码:
from PySide2.QtCore import QByteArray
def dat_file_decryptor(array):
decryptedFile = QByteArray()
currIndex = 0
while currIndex < array.size():
currentByte = ord(array[currIndex]) #unsigned char
currIndex += 1
if currentByte == 0xFF:
decryptedFile.append(0xD)
#pass
validate = currentByte & 0x7F
if currentByte & 0x80:
while validate > 0:
if currIndex >= array.size():
break
currentByte = ord(array[currIndex])
currIndex += 1
firstByte = cryptoArray[(currentByte & 0xF0) >> 4]
decryptedFile.append(firstByte)
if validate <= 1:
break
secondByte = cryptoArray[currentByte & 0xF]
if not secondByte:
break
decryptedFile.append(secondByte)
validate -= 2
else:
while validate > 0:
if currIndex >= array.size():
break
currentByte = ord(array[currIndex])
currIndex +=1
decryptedFile.append(chr(currentByte ^ 0x33)) #If I don't use chr() here I get an OverFlow error
validate -= 1
return decryptedFile
如果您想自己尝试,以下是您需要的数据:
array = b'\n\x10\x13rPG\x13wRGR\xff$\x10\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\xff\x04wRGR\x8
9\x15\x15\x15\x15@\xff\x04wRGR\x88\x16\x15\x16\x1a\xff\x04wRGR\x88\x17\x15\x17\x1c\xff\x04wRGR\x89\x18\x15\x18\x15@\xff\x04wRGR\x88\x19\x15\x19\x1a\xff\x04wRGR\x88\x1a\x15\x1a\x1a\xff\x04
wRGR\x88\x1b\x16\x15\x17\xff\x04wRGR\x88\x1c\x16\x16\x16\xff\x04wRGR\x88\x1d\x16\x17\x17\xff\x04wRGR\x89\x15Aa\x81p\xff\x04wRGR\x89\x15Qa\x91P\xff\x04wRGR\x89\x15aa\xa1P\xff\x04wRGR\x89\x
15qqQ`\xff\x04wRGR\x89\x15\x81qap\xff\x04wRGR\x89\x15\x91qq`\xff\x04wRGR\x89\x15\xa1q\x81p\xff\x04wRGR\x89\x15\xb1q\x91p\xff\x04wRGR\x89\x15\xc1q\xa1`\xff\x04wRGR\x89\x15\xd1\x81QP\xff\x0
4wRGR\x89\x16A\x91Q`\xff\x04wRGR\x89\x16Q\xa1QP\xff\x04wRGR\x8a\x16a\xb1QT\xff\x04wRGR\x89\x16q\xb1a\x90\xff\x03V]W\xff$\x10\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0
e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x0e\x10\xff\x07\x10\x13gZG_V\xff\tr:\x02:IG@\x02V\xff\tr:\x01:IG@\x01V\xff\tr:\x00:IG@\x00V\xff\tr:\x07:IG@\x07V\xff\
tr:\x06:IG@\x06V\xff\x07r:\x05:IG@\x84v\xd4\x01V\xff\x07r:\x04:IG@\x84v\xd5\x01V\xff\x01M\xff'
【问题讨论】: