Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.08.2016, 16:03   #1
beginner41
Новичок
Джуниор
 
Регистрация: 01.08.2016
Сообщений: 1
По умолчанию Перевести код из C# в Delphi

Доброго времени суток, помогите перевести код из 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

Но мне к сожалению это не помогло(.

Последний раз редактировалось beginner41; 01.08.2016 в 16:37. Причина: Поправил ссылку на программу
beginner41 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
перевести код на С++ из Delphi yakuza Общие вопросы C/C++ 1 24.04.2011 00:06
перевести код с Delphi в C++ Drunken_Sailor Общие вопросы C/C++ 1 18.05.2010 22:54
перевести код с vb в delphi fize Помощь студентам 11 11.01.2010 18:40
Перевести код из С++ на DELPHI JustKurt Фриланс 8 06.07.2009 16:31
Перевести код с Delphi на С++ Vladya Помощь студентам 10 30.03.2009 20:31