Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

CRC32 - понимаш   Найти похожие ветки 

 
Frozzen   (2004-04-25 16:26) [0]

подскажите где может быть косяк в нахождении crc искать запарился
таблицу не привожу она правельная?

function  Crc32Next (CRC32Current: LongWord; data: LongWord): LongWord;
Asm //EAX - CRC32Current; EDX - Data;
   XOR EDX, EAX
   AND EDX, $FF                      
   SHR EAX, 8
   XOR EAX, DWORD PTR CRC32Tab[EDX]
End;//Crc32Next
//------------------------------------------------------------------------------

function GetCRC32(data : String): LongWord;
var i : Integer;
begin
Result := $FFFFFFFF;
for i := 1 to Length(data) do
   Result := Crc32Next(Result, LongWord(data[i]));
Asm
 NOT   Result
end;
end;


 
Frozzen   (2004-04-25 16:26) [0]

подскажите где может быть косяк в нахождении crc искать запарился
таблицу не привожу она правельная?

function  Crc32Next (CRC32Current: LongWord; data: LongWord): LongWord;
Asm //EAX - CRC32Current; EDX - Data;
   XOR EDX, EAX
   AND EDX, $FF                      
   SHR EAX, 8
   XOR EAX, DWORD PTR CRC32Tab[EDX]
End;//Crc32Next
//------------------------------------------------------------------------------

function GetCRC32(data : String): LongWord;
var i : Integer;
begin
Result := $FFFFFFFF;
for i := 1 to Length(data) do
   Result := Crc32Next(Result, LongWord(data[i]));
Asm
 NOT   Result
end;
end;


 
Yanis ©   (2004-04-25 16:32) [1]

>правельная?
:)

Попробуй другой алгоритм. Если этот проблемный.


 
Yanis ©   (2004-04-25 16:32) [1]

>правельная?
:)

Попробуй другой алгоритм. Если этот проблемный.


 
Frozzen   (2004-04-25 16:36) [2]

а мож не стремиться к стандарту
работает да и ладно


 
Frozzen   (2004-04-25 16:36) [2]

а мож не стремиться к стандарту
работает да и ладно


 
Yanis ©   (2004-04-25 16:39) [3]

Так работает или нет!? Ты определись сначала.

Не надо выбумавать велосипед, когда уже есть машина.

з.ы. Но это не значит, что не стандартное мышление не приветствуется!


 
Yanis ©   (2004-04-25 16:39) [3]

Так работает или нет!? Ты определись сначала.

Не надо выбумавать велосипед, когда уже есть машина.

з.ы. Но это не значит, что не стандартное мышление не приветствуется!


 
Sha ©   (2004-04-25 17:40) [4]

unit CRCunit;
interface
function GetNewCRC(OldCRC: cardinal; StPtr: pointer; StLen: integer): cardinal;
procedure UpdateCRC(StPtr: pointer; StLen: integer; var CRC: cardinal);
function GetZipCRC(StPtr: pointer; StLen: integer): cardinal;
function GetFileCRC(const FileName: string): cardinal;

implementation
var
 CRCtable: array[0..255] of cardinal;

function GetNewCRC(OldCRC: cardinal; StPtr: pointer; StLen: integer): cardinal;
asm
 test edx,edx;
 jz @ret;
 neg ecx;
 jz @ret;
 sub edx,ecx; // Address after last element

 push ebx;
 mov ebx,0; // Set ebx=0 & align @next
@next:
 mov bl,al;
 xor bl,byte [edx+ecx];
 shr eax,8;
 xor eax,cardinal [CRCtable+ebx*4];
 inc ecx;
 jnz @next;
 pop ebx;

@ret:
end;

procedure UpdateCRC(StPtr: pointer; StLen: integer; var CRC: cardinal);
begin
 CRC:=GetNewCRC(CRC,StPtr,StLen);
end;

function GetZipCRC(StPtr: pointer; StLen: integer): cardinal;
begin
 Result:=not GetNewCRC($FFFFFFFF, StPtr, StLen);
end;

function GetFileCRC(const FileName: string): cardinal;
const
 BufSize = 64*1024;
var
 Fi: file;
 pBuf: PChar;
 Count: integer;
begin
 Assign(Fi,FileName);
 Reset(Fi,1);
 GetMem(pBuf,BufSize);
 Result:=$FFFFFFFF;
 repeat
   BlockRead(Fi,pBuf^,BufSize,Count);
   if Count=0 then break;
   Result:=GetNewCRC(Result,pBuf,Count);
 until false;
 Result:=not Result;
 FreeMem(pBuf);
 CloseFile(Fi);
end;

procedure CRCInit;
var
 c: cardinal;
 i, j: integer;
begin
 for i:=0 to 255 do begin
   c:=i;
   for j:=1 to 8 do if odd(c) then c:=(c shr 1) xor $EDB88320 else c:=(c shr 1);
   CRCtable[i]:=c;
 end;
end;

initialization
 CRCinit;
end.


Пример использования:

uses
 CRCunit;
procedure TForm1.Button1Click(Sender: TObject);
const
 FileName="CRCunit.pas";
begin
 ShowMessage("CRC32 файла="+IntToHex(GetFileCRC(FileName),8));
 ShowMessage("CRC32 имени="+IntToHex(GetZipCRC(PChar(FileName),Length(FileName)),8));
end;


 
Sha ©   (2004-04-25 17:40) [4]

unit CRCunit;
interface
function GetNewCRC(OldCRC: cardinal; StPtr: pointer; StLen: integer): cardinal;
procedure UpdateCRC(StPtr: pointer; StLen: integer; var CRC: cardinal);
function GetZipCRC(StPtr: pointer; StLen: integer): cardinal;
function GetFileCRC(const FileName: string): cardinal;

implementation
var
 CRCtable: array[0..255] of cardinal;

function GetNewCRC(OldCRC: cardinal; StPtr: pointer; StLen: integer): cardinal;
asm
 test edx,edx;
 jz @ret;
 neg ecx;
 jz @ret;
 sub edx,ecx; // Address after last element

 push ebx;
 mov ebx,0; // Set ebx=0 & align @next
@next:
 mov bl,al;
 xor bl,byte [edx+ecx];
 shr eax,8;
 xor eax,cardinal [CRCtable+ebx*4];
 inc ecx;
 jnz @next;
 pop ebx;

@ret:
end;

procedure UpdateCRC(StPtr: pointer; StLen: integer; var CRC: cardinal);
begin
 CRC:=GetNewCRC(CRC,StPtr,StLen);
end;

function GetZipCRC(StPtr: pointer; StLen: integer): cardinal;
begin
 Result:=not GetNewCRC($FFFFFFFF, StPtr, StLen);
end;

function GetFileCRC(const FileName: string): cardinal;
const
 BufSize = 64*1024;
var
 Fi: file;
 pBuf: PChar;
 Count: integer;
begin
 Assign(Fi,FileName);
 Reset(Fi,1);
 GetMem(pBuf,BufSize);
 Result:=$FFFFFFFF;
 repeat
   BlockRead(Fi,pBuf^,BufSize,Count);
   if Count=0 then break;
   Result:=GetNewCRC(Result,pBuf,Count);
 until false;
 Result:=not Result;
 FreeMem(pBuf);
 CloseFile(Fi);
end;

procedure CRCInit;
var
 c: cardinal;
 i, j: integer;
begin
 for i:=0 to 255 do begin
   c:=i;
   for j:=1 to 8 do if odd(c) then c:=(c shr 1) xor $EDB88320 else c:=(c shr 1);
   CRCtable[i]:=c;
 end;
end;

initialization
 CRCinit;
end.


Пример использования:

uses
 CRCunit;
procedure TForm1.Button1Click(Sender: TObject);
const
 FileName="CRCunit.pas";
begin
 ShowMessage("CRC32 файла="+IntToHex(GetFileCRC(FileName),8));
 ShowMessage("CRC32 имени="+IntToHex(GetZipCRC(PChar(FileName),Length(FileName)),8));
end;



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.031 c
4-1079681594
Dmitry-K
2004-03-19 10:33
2004.05.09
Работа с двумя мониторами???


6-1079679862
slgeo
2004-03-19 10:04
2004.05.09
Не возвращается количество полученных байт в блокирующисокетах???


1-1082308700
Relaxxx
2004-04-18 21:18
2004.05.09
Очень хочу нацчится делать коасивое меня, в стиле OfficeXP


7-1079005742
bg8
2004-03-11 14:49
2004.05.09
Синхронизация приборов с помощью TTL логики


1-1082443759
an-na2002
2004-04-20 10:49
2004.05.09
Выполнение программы и TEdit





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский