powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Требуется помощт в конвертации C# в Delphi
16 сообщений из 16, страница 1 из 1
Требуется помощт в конвертации C# в Delphi
    #39484561
Фотография Kast2K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, коллеги!
Из старой чужой библиотеки, написанной на дотнете, выдрал при помощи JetBrains dotPeek следующую функцию:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
  internal static unsafe int CalculateChecksum(byte* byteArray)
  {
    // ISSUE: fault handler
    try
    {
      int num1 = 0;
      int num2 = 0;
      do
      {
        if (num2 != 12 && num2 != 7)
          num1 = (int) *(byte*) (num2 + (IntPtr) byteArray) + num1; 
        ++num2;
      }
      while (num2 < 19);
      int num3 = num1;
      int num4 = 3844;
      int num5 = num3 / num4 * 3844;
      return num3 - num5;
    }
    __fault
    {
      GNEncoder gnEncoder;
      // ISSUE: method pointer
      // ISSUE: cast to a function pointer type
      \u003CModule\u003E.___CxxCallUnwindDtor((__FnPtr<void (void*)>) __methodptr(GNEncoder\u002E\u007Bdtor\u007D), (void*) &gnEncoder);
    }
  }



Пытаюсь сконвертировать в Delphi
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
procedure TForm5.Button1Click(Sender: TObject);
var
  n1, n2, n3, n4, i:Integer;
  n5:Extended;
  b:TBytes;
  s:string;
begin
  s:='адавакедавра!адавакедавра!';
  b:=TEncoding.UTF8.GetBytes(s);
  n1:=0;
  n2:=0;
  while n2<19 do
    begin
      if (n2<>12) and (n2<>7) then
        n1:=Byte(n2+length(b))+n1; //смущает правильность понимания переноса IntPtr
      Inc(n2);
    end;
  n3:=n1;
  n4:=3844;
  n5:=n3/n4*3844;
  i:=n3-trunc(n5);
end;



Правильно ли я перенес функцию?

Вопрос родился, т.к. при любых значениях переменной S я получаю на выходе 0. А текущая работающая система говорит "Checksum error" при некорректных данных.

Никогда не бойся делать то, что не умеешь.
Помни, профессионалы построили Титаник, а Ковчег любители.
...
Рейтинг: 0 / 0
Требуется помощт в конвертации C# в Delphi
    #39484588
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kast2KПравильно ли я перенес функцию?


Неправильно.



Код: c#
1.
      num1 = (int) *(byte*) (num2 + (IntPtr) byteArray) + num1; 


видимо так:
Код: pascal
1.
     num1 := num1 + bytearray[num2];
...
Рейтинг: 0 / 0
Требуется помощт в конвертации C# в Delphi
    #39484591
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kast2KПравильно ли я перенес функцию?

Нет. Первое, что бросается в глаза - цикл с постусловием вдруг ставший циклом с предусловием.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Требуется помощт в конвертации C# в Delphi
    #39484617
Фотография Kast2K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поправил.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
var
  n1, n2, n3, n4, i:Integer;
  n5:Extended;
  b:TBytes;
  s:string;
begin
  s:='адавакедавра!адавакедавра!';
  b:=TEncoding.UTF8.GetBytes(s);
  n1:=0;
  n2:=0;
  repeat
    if (n2<>12) and (n2<>7) then
      n1:=b[n2]+n1;
    Inc(n2);
  until n2=19;
  n3:=n1;
  n4:=3844;
  n5:=n3/n4*3844;
  i:=n3-trunc(n5);
end;



Результат пока тот же.
...
Рейтинг: 0 / 0
Требуется помощт в конвертации C# в Delphi
    #39484624
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kast2K
Код: c#
1.
int num5


Kast2K
Код: pascal
1.
n5:Extended;
...
Рейтинг: 0 / 0
Требуется помощт в конвертации C# в Delphi
    #39484627
Фотография Kast2K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,
но ведь делятся целые числа, значит будет дробь
...
Рейтинг: 0 / 0
Требуется помощт в конвертации C# в Delphi
    #39484656
sql2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kast2KArioch,
но ведь делятся целые числа, значит будет дробь

Тебе корректный результат нужен (int), как на C# или Extended?
...
Рейтинг: 0 / 0
Требуется помощт в конвертации C# в Delphi
    #39484668
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
  n4:=3844;
  n5:=n3/n4*3844;



проще говоря, n5 := n3 - n3 mod 3844 :-)
...
Рейтинг: 0 / 0
Требуется помощт в конвертации C# в Delphi
    #39484670
Фотография Kast2K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sql2012,

корректный конечно.

Коллеги, отбой.
Функция всегда вернет нулевое значение, т.к.
int num4 = 3844; - константа
int num5 = num3 / num4 * 3844; - здесь всегда num5 будет равен num3
return num3 - num5; - следовательно тут всегда будет 0.

Видимо JetBrains dotPeek выдрал неправильно. :(
...
Рейтинг: 0 / 0
Требуется помощт в конвертации C# в Delphi
    #39484672
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kast2K но ведь делятся целые числа, значит будет дробь

открой для себя "целочисленное деление с остатком"
...
Рейтинг: 0 / 0
Требуется помощт в конвертации C# в Delphi
    #39484675
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kast2Kздесь всегда num5 будет равен num3

нет, здесь будет num3 округлённый вниз до ближайшего 3844*i
...
Рейтинг: 0 / 0
Требуется помощт в конвертации C# в Delphi
    #39484681
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kast2K
Код: pascal
1.
  until n2=19;



Давно ли отрицание "меньше" стало строгим равенством вместо >= ?
...
Рейтинг: 0 / 0
Требуется помощт в конвертации C# в Delphi
    #39484704
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
  s:='адавакедавра!адавакедавра!';
  b:=TEncoding.UTF8.GetBytes(s);



почему UTF8 - если строка в UTF16 ?

вот тут ты и получаешь сломанный юникод = пустую строку = пусой массив

короче, начни с того, чтобы убедиться, что данные на вход попадают идентичные, байт за байтом.
не буква за буквой черт знает где в какой кодировке, а байт за байтом

~~~~~~~~~~~~~~~~~~~

похоже на то, что эта хрень хэширует не весь буфер, а только каждый 4-й байт....

Код: plaintext
1.
num1 = (int) *(byte*) (num2 + (IntPtr) byteArray) + num1;



(IntPtr) byteArray - скорее всего PInteger(@b[ Low(b) ])
Самое начало буфера (первый элемент массива), взятый как указатель на int32

n2 + PInteger - если включено $PointerMath - то указатель сдвинутый на n2 размеров int32 (а не байтов)

*(byte*) - но адрес начала следующего целого слова мы снова обзываем PByte и берем от него только один байт

В общем, если верить этому бреду, то получается примерно такая хрень какая-то плюс-минус километр

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
var b: TBytes; pi: PInteger; 

  b:=TEncoding.UTF8.GetBytes(s);

  if b = nil {if length(b) <= 0} then Exit (0); // или что там у нас в случае пустого буфера должно быть?
  n1:=0;
  n2:=0;
  pi := pointer( @b[Low(b)] );
  repeat
    if (n2<>12) and (n2<>7) then
       Inc( n1, pi^ and High(byte) );
    Inc(n2);
    Inc(pi);
  until n2>=19;
//  n3:=n1;
//  n4:=3844;
//  n5:=n3/n4*3844;   // = n1 - n1 mod 3844
//  i:=n3-trunc(n5);    // = n1 - (n1 - n1 mod 3844)
     Result := n1 mod 3844;



Не хэш, а бред какой-то
...
Рейтинг: 0 / 0
Требуется помощт в конвертации C# в Delphi
    #39484734
Фотография Kast2K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochНе хэш, а бред какой-то

Что верно, то верно.

Спасибо за помощь!

К сожалению, на реальных данных результат неправильный.
Буду копать систему дальше, т.к. что-то упустил.
...
Рейтинг: 0 / 0
Требуется помощт в конвертации C# в Delphi
    #39484754
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хэшируются байты, а не строки

тебе нужно запустить эту хрень под отладчиком - и понять какие реально байты заходят на вход той хэш-функции

а то ты пустой массив хэшируешь ,как я выше писал
...
Рейтинг: 0 / 0
Требуется помощт в конвертации C# в Delphi
    #39484842
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
Result := n1 mod 3844;  - это верно



А складывать надо научиться байты, а не строки, и ни их преобразования.

И что мешает скомпилировать с# функцию в отдельном проекте и сравнить результаты?
Компилятор то у всех есть
C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Требуется помощт в конвертации C# в Delphi
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]