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