Доброго времени суток, помогите перевести код из C# в Delphi.
Данная программа шифрует и дешифрует ключ записанный в реестре(вводится из реестра в текстовое поле программы вручную).
Пример: переводит строку вида F4C8-A06SF-8948S-2A5A0-JE57N в C980A4308F50B282250FB1CAE90145 и обратно, вот как раз обратное действие и нужно использовать в моей программе написанной на Delphi. Заранее спасибо за помощь.
Нашел на форуме описание кода(кто-то уже занимался переводом):
Код:
public partial class Form_Main : Form{
public Form_Main() { InitializeComponent(); } // инициализация формы (не интересно особо)
private void btnConvertTo_Click(object sender, EventArgs e) { // обработка нажатия на кнопку конвертации туда
var converter = new ArmASerialConverter(); // создание экземпляра класса конвертера
var bytes = converter.SerialToRegistry(txtKeyTo.Text); // вызов метода для конвертации
txtRegistryTo.Text = BitConverter.ToString(bytes); // преобразование результата в строку
}
private void btnConvertFrom_Click(object sender, EventArgs e) {// обработка конвертации на нажатие кнопки конвертации обратно
var bytes = HexStringToBytes(txtRegistryFrom.Text); // преобразование в строку из байтов
var converter = new ArmASerialConverter(); // создание экземпляра класса конвертера
txtKeyFrom.Text = converter.RegistryToSerial(bytes); // преобразование в строку
}
private static Byte[] HexStringToBytes(String hexString){
// удаление символов из строки: пробела, -\r \n \t , ;
var normalizedHex = hexString.Replace(" ", "").Replace("-", "").Replace("\r", "").Replace("\n", "").Replace("\t", "").Replace(",", "").Replace(";", "");
return Enumerable.Range(0, normalizedHex.Length).Where(x => x % 2 == 0).Select(x => Convert.ToByte(normalizedHex.Substring(x, 2), 16)).ToArray();
// вызов стандартного метода переконвертации шестнадцатеричной строки в байты и возвращение в виде массива байт
}}}
Класс конвертер
Код:
public class ArmASerialConverter {
private static readonly String szTemplate = "0123456789ABCDEFGHJKLMNPRSTVWXYZ";
// на вход методу конвертации подается строка, возвращается массив байт
public Byte[] SerialToRegistry(String arma2key) {
var upperkey = arma2key.Trim().ToUpper().Replace('O', '0').Replace('I', '1').Replace("-", ""); // преобразование строки поданной на вход в верхний регистр, обрезание всех пробелов слева и справа, замена O на нуль, I на 1, удаление тире из строки
var bResult = new Byte[15]; // создание массива байт из 15 элементов
for (var i = 0; i < 3; ++i) { UInt64 qwResult = 0; // цикл от 0 до 2
for (var j = 0; j < 8; ++j) { // цикл от 0 до 7 (т.к. 64 бита и 8 последовательностей по 8 бит)
var cChar = upperkey[i * 8 + j]; // получение элемента из строки upperkey в виде char
var szPos = szTemplate.IndexOf(cChar); // получение индекса (позиции) символа cChar в строке szTemplate
qwResult |= (UInt64)szPos << (j * 5);} // сдвиг 64 битной целочисленной переменной на j * 5 влево и произведение операции побитового ИЛИ над этой 64 битной переменной и qwResult и запись результата в qwResult
for (var j = 0; j < 5; ++j) { // цикл от 0 до 4
bResult[i * 5 + 5 - 1 - j] = (Byte)(qwResult & 0xFF); // произведение операции побитового И по маске 0xFF над qwResult и приведение к типу байт и запись в массив bResult по индексу i * 5 + 5 - 1 - j
qwResult >>= 8; // сдвиг qwResult вправо на 8
}}
return bResult;} // возврат результата
// на вход обратной переконвертации подается массив байт, возвращается строка
public String RegistryToSerial(Byte[] arma2registry){
var bResult = ""; //пустая строка
for (var i = 0; i < 3; ++i) { UInt64 qwResult = 0; // цикл от 0 до 2
for (var j = 0; j < 5; ++j) { // цикл от 0 до 4
qwResult <<= 8; // сдвиг влево на 8 бит qwResult 64битной переменной целочисленной
qwResult |= arma2registry[i * 5 + j]; // произведение операции побитового ИЛИ над qwResult и i * 5 + j и запись результата в qwResult
} for (var j = 0; j < 8; ++j) { // цикл от 0 до 7
var szPos = (qwResult >> (j * 5)) & 0x1F; // сдвиг вправо qwResult на (j * 5) и произведение над полученным операции побитового И по маске 0x1F и запись в szPos
var cChar = szTemplate[(Int32)szPos]; // получение позиции символа в массиве szTemplate по индексу и запись в cChar
bResult += cChar; // конкатенация символа к результату то есть добавление cChar в строку bResult в конец
}} return bResult; }} // возврат результата
http://www.programmersforum.ru/showthread.php?t=273571
Но мне к сожалению это не помогло(.