Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема при конвертации с С 
V
    Опции темы
CynicRus
Дата 6.12.2014, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: нет
Всего: 5



Приветствую господа, потребовалось перевести с Си следующий код:
Код

void BSARecord::calculateHash() {
    unsigned l = (len>>1);
    unsigned sum, off, temp, i, n;

    for(sum = off = i = 0; i < l; i++) {
        sum ^= (((unsigned)(name[i]))<<(off&0x1F));
        off += 8;
    }
    hash.value1 = sum;

    for(sum = off = 0; i < len; i++) {
        temp = (((unsigned)(name[i]))<<(off&0x1F));
        sum ^= temp;
        n = temp & 0x1F;
        sum = (sum << (32-n)) | (sum >> n);  // binary "rotate right"
        off += 8;
    }
    hash.value2 = sum;
}



Где у Hash поля = unsigned.

Перевожу следующим образом:
Код

function GenHash1(Data: TAbstractFile): int64;
var
  len, sum, off, i: Integer;
  Name: AnsiString;
begin
  Name:=AnsiString(Data.Directory + Data.Name);
  len := Length(Name);
  sum := 0;
  i := 1;
  off := 0;
  while i < len - 1 do
  begin
    sum := sum xor LongWord(Name[i]) shl (off and $1F);
    off := off + 8;
    Inc(i);
  end;
  result := sum;
end;

function GenHash2(Data: TAbstractFile): int64;
var
  len, sum, off, i, temp, n: Integer;
  Name: AnsiString;
begin
  Name:=AnsiString(Data.Directory + Data.Name);
  len := Length(Name);
  sum := 0;
  i := 1;
  off := 0;
  temp := 0;
  while i < len - 1 do
  begin
    temp := sum xor LongWord(Name[i]) shl (off and $1F);
    sum := sum xor temp;
    n := temp and $1F;
    sum := (sum shl (32 - n)) or (sum shr n);
    off := off + 8;
    Inc(i);
  end;
  result := sum;
end;


В строках данные одинаковые. А вот результаты работы абсолютно разные. На одой и той же строке, я получаю разные данные в полях Value на C, и в результате работы своих функций. Собствено вопрос - что я понял не так?-) И главное - как это перевести правильно?

Это сообщение отредактировал(а) Poseidon - 6.12.2014, 22:00
PM MAIL   Вверх
CynicRus
Дата 6.12.2014, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: нет
Всего: 5



Так, в первой функции нашёл косяк вроде:
Код

function GenHash1(Data: TAbstractFile): int64;
var
  len, sum, off, i,l: Integer;
  Name: AnsiString;
begin
  Name:=AnsiString(Data.Directory + Data.Name);
  len := Length(Name);
  l:= len shr 1;
  sum := 0;
  i := 1;
  off := 0;
  while i < l do
  begin
    sum := sum xor LongWord(Name[i]) shl (off and $1F);
    off := off + 8;
    Inc(i);
  end;
  result := sum;
end;

function GenHash2(Data: TAbstractFile): int64;
var
  len, sum, off, i, temp, n,start: Integer;
  Name: AnsiString;
begin
  Name:=AnsiString(Data.Directory + Data.Name);
  len := Length(Name);
  Start:=(len shr 1);
  i:= Start+1;
  sum := 0;
 // i := 1;
  off := 0;
  temp := 0;
  while i < len do
  begin
    temp := (LongWord(Name[i]) shl (off and $1F));
    sum := sum xor temp;
    n := temp and $1F;
    sum := (sum shl (32 - n)) or (sum shr n);
    off := off + 8;
    Inc(i);
  end;
  result := sum;
end;


Во второй вроде бы тоже, но чёт...неа не фурычит, как надо.

Это сообщение отредактировал(а) CynicRus - 6.12.2014, 22:17
PM MAIL   Вверх
CynicRus
Дата 8.12.2014, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: нет
Всего: 5



Проблема разрулена. У Delphi в строках #0 на конце, отсюда и глюки. Length -1 и всё считается идентично. Убита куча времени из-за ничего. Хех.
PM MAIL   Вверх
bems
Дата 8.12.2014, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Length не включает завершающий 0, кроме случаев когда ты запихнул 0 в строку в явном виде.


--------------------
Обижено школьников: 8
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0445 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.