Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Проблема при конвертации с С


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

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, и в результате работы своих функций. Собствено вопрос - что я понял не так?-) И главное - как это перевести правильно?

Автор: CynicRus 6.12.2014, 20:05
Так, в первой функции нашёл косяк вроде:
Код

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 8.12.2014, 13:06
Проблема разрулена. У Delphi в строках #0 на конце, отсюда и глюки. Length -1 и всё считается идентично. Убита куча времени из-за ничего. Хех.

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)