program crch; {$APPTYPE CONSOLE} uses SysUtils, CRC32; procedure AddToFile(const buffer: Pointer; const Size:byte); var f: file of byte; begin AssignFile(f,ParamStr(1)); Reset(f); try Seek(f,FileSize(f)); Blockwrite(f,buffer^,size); finally CloseFile(f); end; end; var ReqCRC, CRC, dummie: Cardinal; Buffer: Pointer; i:Byte; j:Word; c: Cardinal; begin if FileExists(ParamStr(1)) then CRC:=FileCRC32(ParamStr(1)) else Halt(1); ReqCRC:=StrToInt('$'+ParamStr(2)); if ReqCRC = CRC then Halt(2); //1 byte for i:=0 to High(i) do begin Buffer:=@i; dummie:=CRC; CalcCRC(dummie,buffer,1); if dummie=ReqCRC then begin AddToFile(buffer,1); Halt(0); end; end; //2 bytes for j:=0 to High(j) do begin Buffer:=@j; dummie:=CRC; CalcCRC(dummie,buffer,2); if dummie=ReqCRC then begin AddToFile(buffer,2); Halt(0); end; end; //3 bytes GetMem(buffer,3); try For j:=0 to High(j) do begin PChar(buffer)[0]:=Chr(Hi(j)); PChar(buffer)[1]:=Chr(Lo(j)); for i:=0 to High(i) do begin PChar(buffer)[2]:=Chr(i); dummie:=CRC; CalcCRC(dummie,buffer,3); if dummie=ReqCRC then begin AddToFile(buffer,3); Halt(0); end; end; end; finally FreeMem(buffer,3) end; //4 bytes c:=0; repeat Buffer:=@c; dummie:=CRC; CalcCRC(dummie,buffer,4); if dummie=ReqCRC then begin AddToFile(buffer,4); Halt(0); end; c:=c+1; until c=4294967295; //4 bytes final Buffer:=@c; dummie:=CRC; CalcCRC(dummie,buffer,4); if dummie=ReqCRC then begin AddToFile(buffer,4); Halt(0); end; end.