Найти - Пользователи
Полная версия: Пытаюсь переписать функцию с С++ на Python, не получается.
Начало » Python для новичков » Пытаюсь переписать функцию с С++ на Python, не получается.
1
Bujhm666
Здравствуйте. Вот пытаюсь переписать функцию шифрования строки с С++ Qt, на Python + Qt.

Функция оригинал:
QString stringEncrypt(QString strInput, QString strPassword)
{
int i,j;
QString strOutput="";

// Перевод строк в битовые массивы с использованием локальных таблиц
QByteArray baInput = strInput.toLocal8Bit();
QByteArray baPassword = strPassword.toLocal8Bit();

// Кодирование информации
for (i=0; i < baInput.size(); i++)
{
for (j=0; j < baPassword.size(); j++)
{
// XOR - кодировка символа
baInput[i] = baInput[i] ^ (baPassword[j] + (i*j));
}

//Преобразование числа в шестнадцатеричную систему
strOutput += QString("%1").arg((int)((unsigned char)baInput[i]),2,16,QChar('0'));
}

//Возврат кодированной строки
return strOutput;
}
А это мои потуги по переделке:
# -*- coding: utf-8 -*-

from PyQt4 import QtCore

# Кодирование строки
def stringEncrypt(strInput, strPassword):
strOutput = QtCore.QString('')

# Перевод строк в битовые массивы с использованием локальных таблиц
baInput = QtCore.QByteArray(QtCore.QString(strInput).toLocal8Bit())
baPassword = QtCore.QByteArray(QtCore.QString(strPassword).toLocal8Bit())

# Кодирование информации
for i in range(baInput.size()):
for j in range(baPassword.size()):
# XOR - кодировка символа
baInput[i] = baInput[i] ^ (baPassword[j] + (i*j))

#Преобразование числа в шестнадцатеричную систему
strOutput += QString("%1").arg(int(chr(baInput[i])),2,16,QChar('0'))

# Возврат кодированной строки
return strOutput
В общем - не работает, интерпретатор ругается на: baInput = baInput ^ (baPassword + (i*j)). Пока застрял на этом. Ну и не знаю правильно ли я сделал: strOutput += QString(“%1”).arg(int(chr(baInput)),2,16,QChar('0'))
dartNNN
Ну вобщем что-то такое у меня получилось:
for i in range(baInput.size()):
baInputbuf = ord(baInput[i])
for j in range(baPassword.size()):
# XOR - кодировка символа
baInputbuf = baInputbuf ^ (ord(baPassword[j]) + (i*j))

#Преобразование числа в шестнадцатеричную систему
strOutput += QtCore.QString("%1").arg(baInputbuf,2,16,QtCore.QChar('0'))
Эта фигня как-то работает, детально не проверял.
По-моему тут такая вещь: в С++ char может быть и char, а может быть как число. В питоне такого нету, поэтому от baInput я беру его номер. Еще PyQt вдруг ругнулось, что байтАррей не поддерживает присваивание элементов, поэтому пришлось использовать еще одну переменную.
В результате в baInputbuf оказывается int, который без лишних танцев с бубном проглатывает функция arg()
Возможно в моем коде есть смысловая ошибка, т.к. я не задумывался что там чем шифруется и как всве это дальше должно использоваться.
Bujhm666
Спасибо. Сейчас буду экспериментировать. Там еще и декодирование, но с ним пока не заморачивался, застрял на шифровании.
o7412369815963
символы в число и обратно конвертнуть можно с пом. ord и chr
Bujhm666
Было желание замутить все это на Qt с помощью QString - QByteArray, но так ничего и не получилось. Более того, по моему и исходный вариант на C++ то же не рабочий. У себя проверить не могу, но посмотрев документацию по Qt на QByteArray, получается, что он не поддерживает присваивание в том виде, в каком оно реализовано в исходной функции. Так что пока пользуюсь вот этим:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from PyQt4 import QtCore

def xor(pw, str1):
c = 0
liste = []
for k in xrange(len(str1)):
if c > len(pw)-1:
c = 0
fi = ord(pw[c])
c += 1
se = ord(str1[k])
fin = fi ^ se
liste += [chr(fin)]
return liste

def encrypt(passw, string):
ret = xor(passw, string)
print "Ecnrypted form:",
for k in ret:
print ord(k)

def decrypt(passw, ret):
listing = []
for num in map(int, ret.split(' ')):
listing += [chr(int(num))]

finale = xor(passw, listing)
print "Decrypted form:",
print "".join(finale)
Bujhm666
Поторопился я с предыдущим постом, все работает (спасибо dartNNN). Для меня было важно, что бы принимал кирилицу. Вот код:

# Кодирование строки
def stringEncrypt(strInput, strPassword):
strOutput = QtCore.QString('')

# Перевод строк в битовые массивы с использованием локальных таблиц
baInput = QtCore.QByteArray(QtCore.QString(strInput).toLocal8Bit())
baPassword = QtCore.QByteArray(QtCore.QString(strPassword).toLocal8Bit())

# Кодирование информации
for i in range(baInput.size()):
baInputbuf = ord(baInput[i])
for j in range(baPassword.size()):
# XOR - кодировка символа
baInputbuf = baInputbuf ^ (ord(baPassword[j]) + (i*j))

# Преобразование числа в шестнадцатеричную систему
strOutput += QtCore.QString("%1").arg(baInputbuf,2,16,QtCore.QChar('0'))

# Возврат кодированной строки
return strOutput


# Декодирование строки
def stringDecrypt(strInput, strPassword):
strOutput = QtCore.QString('')

# Декодировка строки из 16-ричной системы в битовый массив
baInput = QtCore.QByteArray.fromHex(QtCore.QString(strInput).toLocal8Bit())
# Перевод строки пароля в битовый массив
baPassword = QtCore.QByteArray(QtCore.QString(strPassword).toLocal8Bit())

# Кодирование информации
for i in range(baInput.size()):
baInputbuf = ord(baInput[i])
for j in range(baPassword.size()):
# XOR - кодировка символа
baInputbuf = baInputbuf ^ (ord(baPassword[j]) + (i*j))

strOutput += QtCore.QChar(baInputbuf)

# Возврат декодированной строки
return strOutput
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB