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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.07.2012, 11:31   #1
Wanderer1977
 
Регистрация: 02.07.2012
Сообщений: 9
По умолчанию Проблема с переносом из .net на Delphi

День добрый!
Возникла необходимость перенести метод, реализованный на Embarcadero Prism на Делфи 2009.

Код:
method GenPassword:String;
var
 str1, str2, str1_md5, str2_md5: String;
 str_byte, str1_md5_arr, str2_md5_arr:array of Byte;
 utf8_str:= new UTF8Encoding;
 md5_sum: MD5;  
begin
 md5_sum:=md5.Create;
 md5_sum.Initialize;

 str1:='< Solt1 >';
 str_byte:=UTF8_str.getbytes(str1);
 str1_md5_arr:=md5_sum.ComputeHash(str_byte);
 str1_md5:=utf8_str.GetString(str1_md5_arr);

 str2:='< solt2 >';
 str_byte:=UTF8_str.getbytes(str2);
 str2_md5_arr:=md5_sum.ComputeHash(str_byte);
 str2_md5:=utf8_str.GetString(str2_md5_arr);

 result:=str1_md5+str2_md5;
end;
на делфи получилось вот что:

Код:
function MD5(const Bytes : TBytes) : String;
var
   idmd5 : TIdHashMessageDigest5;
begin
   idmd5 := TIdHashMessageDigest5.Create;
   try
     result :=LowerCase(idmd5.HashBytesAsHex(Bytes));
   finally
     idmd5.Free;
   end;
end;


procedure TForm1.Button1Click(Sender: TObject);

var
 str1,str2:String;
 str1_md5,str2_md5:String;
 md5_all: String;
 str1_byte,str2_byte,Str_byte: TBytes;

begin

  str1:='< solt1 >';
  str1_byte:=TEncoding.UTF8.getbytes(str1);
  str1_md5:=MD5(str1_byte);

  str2:='< solt2 >';
  str2_byte:=TEncoding.UTF8.getbytes(str2);
  str2_md5:=MD5(str2_byte);

  md5_all:=(str1_md5+str2_md5);
А дальше полный ступор: не могу понять как сделать кодировку как в Призме. Там на выходе получается строка в кодировке utf8, которая в отладчике выглядет
Код:
0�a�"d���G�e�F%3��ʧ¨�y���
Wanderer1977 вне форума Ответить с цитированием
Старый 06.07.2012, 06:23   #2
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Вас не смущает, что в варианте под .NET вы MD5 получаете как двоичное значение, а в варианте под Delphi - как строку?

Цитата:
Там на выходе...
"Там" - это где?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 06.07.2012, 06:30   #3
Wanderer1977
 
Регистрация: 02.07.2012
Сообщений: 9
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Вас не смущает, что в варианте под .NET вы MD5 получаете как двоичное значение, а в варианте под Delphi - как строку?
Насчет двоичных значений не понял...

Цитата:
HashAlgorithm.ComputeHash - метод (Byte[])
Вычисляет хэш-значение для заданного массива байтов.

Параметры
Тип: System.Byte[] Входные данные, для которых вычисляется хэш-код.
Возвращаемое значение
Тип: System.Byte[] Вычисляемый хэш-код.

http://msdn.microsoft.com/ru-ru/library/s02tk69a.aspx
Цитата:
Сообщение от GunSmoker Посмотреть сообщение
"Там" - это где?
на выходе метода, который выполняю в отладчике Prism
Wanderer1977 вне форума Ответить с цитированием
Старый 06.07.2012, 06:33   #4
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Насчет двоичных значений не понял...
Prism:
Код:
str1_md5_arr: array of Byte;
str1_md5_arr:=md5_sum.ComputeHash(str_byte);
Delphi:
Код:
str1_md5: String;
str1_md5:=MD5(str_byte);
Либо Prism, либо Delphi надо менять.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 06.07.2012, 06:38   #5
Wanderer1977
 
Регистрация: 02.07.2012
Сообщений: 9
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Prism:
Код:
str1_md5_arr: array of Byte;
str1_md5_arr:=md5_sum.ComputeHash(str_byte);
Delphi:
Код:
str1_md5: String;
str1_md5:=MD5(str_byte);
Либо Prism, либо Delphi надо менять.
не, в призме менять нельзя... Там работает все правильно...Мне надо в Делфи как-то это повторить...

з.ы.
Мне казалось, что это не так важно т.к. значение md5 в результате должно быть одинаковое. Да и в Призме потом массив байтов все равно собирается в строку, только кодировка utf8
Wanderer1977 вне форума Ответить с цитированием
Старый 06.07.2012, 06:47   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Мне надо в Делфи как-то это повторить...
Тогда нужен MD5, который будет возвращать двоичное значение.

Цитата:
Мне казалось, что это не так важно т.к. значение md5 в результате должно быть одинаковое. Да и в Призме потом массив байтов все равно собирается в строку, только кодировка utf8
Не важно - что? Каким образом байты переводятся в строку? Почему это не важно? От этого напрямую зависит результат.

Код Prism переводит байты в строку прямым копированием. Код Delphi вообще не переводит байты в строку. Потому что ему уже возвращают строку. А что в строке? А в строке (скорее всего - тут я угадываю) HEX-представление MD5. А может быть и Base64. Ну, короче, должно быть что-то human-readable (иначе зачем возвращать хэш как строку?).

Надо ли говорить, что кодированное представление двоичной информации - это далеко не то же самое, что прямое копирование данных в строку?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 06.07.2012, 06:47   #7
Wanderer1977
 
Регистрация: 02.07.2012
Сообщений: 9
По умолчанию

а есть реализации MD5 в Delphi, которая считала бы md5 для массива байтов и возвращала результат в виде массива байтов?

Что-то типа MD5(TBytes):TBytes

Последний раз редактировалось Wanderer1977; 06.07.2012 в 06:49.
Wanderer1977 вне форума Ответить с цитированием
Старый 06.07.2012, 06:49   #8
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
а есть реализации MD5 в Delphi, которая считала бы md5 для массива байтов и возвращала результат в виде массива байтов?
Гугл не пробовал? Говорят помогает.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 06.07.2012, 06:51   #9
Wanderer1977
 
Регистрация: 02.07.2012
Сообщений: 9
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Гугл не пробовал? Говорят помогает.
Пробовал конечно, а потом уж решился тут спрашивать...
Wanderer1977 вне форума Ответить с цитированием
Старый 06.07.2012, 06:54   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Пробовал конечно, а потом уж решился тут спрашивать...
Первая же ссылка в гугле по "MD5 Delphi" (без кавычек).
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема с переносом слов BloodMaX PHP 9 24.03.2011 20:26
MySql - проблема с переносом базы alexparser БД в Delphi 2 22.12.2010 14:18
Удаленный SQL-сервер Ado.Net + .Net remoting + Asp .Net gammaray Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 2 22.11.2010 17:36
проблема с переносом текста из TRichEdit в TDBGrid 4ertoffka Фриланс 4 26.01.2010 10:16
Проблема с переносом БД на другой комп HAMMAN Помощь студентам 3 16.05.2008 10:52