procedure TForm1.Button1Click(Sender: TObject);
VAR
i,j,crc:integer;
crc32tbl:array[0..255] of dword;
begin
for i:=0 to 255 do begin
crc:=i;
for j:=0 to 7 do begin
if (crc and 1)=1 then begin
crc:=(crc shl 1) xor $EDB88320;
end else begin
crc:=crc shl 1;
end;
end;
crc32tbl[i]:=crc;
end;
for i:=0 to 255 do begin
memo1.Lines.add(format('%x',[crc32tbl[i]]));
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
VAR
i,j,crc:integer;
crc32tbl:array[0..255] of dword;
begin
for i:=0 to 255 do begin
crc:=i;
for j:=0 to 7 do begin
if (crc and 1)=1 then begin
crc:=(crc shr 1) xor $EDB88320; // 将shl改成shr
end else begin
crc:=crc shr 1; // 将shl改成shr
end;
end;
crc32tbl[i]:=crc;
end;
for i:=0 to 255 do begin
memo1.Lines.add(format('%x',[crc32tbl[i]]));
end;
end;
多谢,在网上搜到答案了
这个也是不对的
if (crc and 1)=1 then begin //此处不能是=1 而应该是<>0
crc:=(crc shr 1) xor $EDB88320; // 将shl改成shr
end else begin
crc:=crc shr 1; // 将shl改成shr
end;
[QUOTE=wping;396517]procedure TForm1.Button1Click(Sender: TObject);
VAR
i,j,crc:integer;
crc32tbl:array[0..255] of dword;
begin
for i:=0 to 255 do begin
c...[/QUOTE]
void MakeTable()//动态生成CRC32的码表
{
int i,j;
unsigned long crc;
for (i = 0; i < 256; i++) {
crc = i;
for (j = 0; j < 8; j++) {
if (crc & 1)
crc = (crc >> 1) ^ 0xEDB88320;
else
crc >>= 1;
}
Crc32Table[i] = crc;
}
}
procedure MakeCRC32Table;
// Polynom-Definition:
// x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x^1+x^0
// 1 0000 0100 1100 0001 0001 1101 1011 0111 = $04C11DB7
// Polynom-Definition revers:
// 1110 1101 1011 1000 1000 0011 0010 0000 1 = $EDB88320
const
cPolynom = $EDB88320;
var
i, k: Integer;
v: DWORD;
begin
GetMem(xCRC32Table, SizeOf(TCRC32Table));
for i := 0 to 255 do begin
v := i;
for k := 0 to 7 do begin
if (v and $01)<>0 then
v := cPolynom xor (v shr 1)
else
v := v shr 1;
end;
xCRC32Table^[i] := v;
end;
end;