![]() |
|
#1
|
|||
|
|||
![]() Помогите мне пожалуйста посчитать контрольную сумму.
Я в ините находил разные алгоритмы, но по ним контрольные суммы не совпадают с контрольными суммами в TotalCommander.. Может компонент специальный нужен.. |
#2
|
|||
|
|||
![]() Есть несколько алгоритмов расчета. Какой тебя интересует?
ЗЫ. А ты точно уверен в том, какой алгоритм используется в Total Commander? |
#3
|
||||
|
||||
![]() вот CRC:
Код:
function GetCRC(FName: string): DWORD; var F: HWND; L, nSize: DWORD; Buffer: array[0..512] of Byte; i: integer; begin F:= CreateFile(PChar(FName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0); L:= 0; while nSize > 0 do begin ReadFile(F, Buffer, SizeOf(Buffer), nSize, nil); for i:=0 to nSize-1 do L:= L+Buffer[i]; end; CloseHandle(F); Result:= L; end; и CRC32: Код:
const CRCPOLY = $EDB88320; var CRCTable: array[0..512] of Longint; procedure BuildCRCTable; var i, j: Word; r: DWORD; begin FillChar(CRCTable, SizeOf(CRCTable), 0); for i:= 0 to 255 do begin r:= i shl 1; for j:= 8 downto 0 do if (r and 1) <> 0 then r:= (r Shr 1) xor CRCPOLY else r:= r shr 1; CRCTable[i]:= r; end; end; function RecountCRC(b: byte; CrcOld: Longint): Longint; begin RecountCRC:= CRCTable[byte(CrcOld xor Longint(b))] xor ((CrcOld shr 8) and $00FFFFFF) end; function GetCRC32(FileName: string): DWORD; var Buffer: PChar; f: File of Byte; b: array[0..255] of Byte; CRC: DWORD; e, i: Integer; begin BuildCRCTable; CRC:= $FFFFFFFF; AssignFile(F, FileName); FileMode:= 0; Reset(F); GetMem(Buffer, SizeOf(B)); repeat FillChar(b, SizeOf(b), 0); BlockRead(F, b, SizeOf(b), e); for i := 0 to (e-1) do CRC:= RecountCRC(b[i], CRC); until (e < 255) or (IOresult <> 0); FreeMem(Buffer, SizeOf(B)); CloseFile(F); CRC:= Not CRC; Result:= CRC; end; |
#4
|
||||
|
||||
![]() В Total Commander считается CRC32 контрольная сумма.
Вот исходник программки которая это делает (Чтобы посчитать, просто перетащи нужный файл на форму проги ) Велик и могуч наш Object Pascal ! ICQ: 357-591-887 |