关于CRC32校验码的问题,希望大家帮忙! ( 积分: 100 )

  • 主题发起人 主题发起人 Neo_leaf
  • 开始时间 开始时间
N

Neo_leaf

Unregistered / Unconfirmed
GUEST, unregistred user!
已知十六进制数组ArrHex($01 $00 $0B $00 $00 $05 $00 $00),
如何求出这些数的CRC32校验码?

我的做法是这样的,大家看看对不:
定义全局数组:
TableCRC : array[0..255] of DWORD;

定义初始化数组函数:
procedure TfrmFinal.MakeTable();
var
i,j,Crc:integer;
begin
for i:=0 to 255 do
begin
Crc:=i;
for j:=0 to 7 do
begin
if (Crc and 1)<>0 then
Crc:=(Crc shr 1) xor $EDB88320
else
Crc:=Crc shr 1;
end;
TableCRC:=Crc;
end;
end;

定义求文件中数据CRC32码函数:
procedure TfrmFinal.GetCRC32File(FileName:string;var CRC32:DWORD);
var
F:file;
BytesRead:DWORD;
Buffer:array[1..65521] of Byte;
i:Word;
begin
FileMode :=0;
CRC32 :=$ffffffff;
{$I-}
AssignFile(F,FileName);
Reset(F,1);
if IoResult = 0 then
begin
repeat
BlockRead(F,Buffer,Sizeof(Buffer),BytesRead);
for i := 1 to BytesRead do
CRC32 := (CRC32 shr 8) xor TableCRC[Buffer xor (CRC32 and $000000ff)];
until BytesRead = 0;
end;
CloseFile(F);
{$I+}
CRC32 := not CRC32;
end;

定义求一字符串CRC32校验码函数:
function TfrmFinal.GetCrc32Str(s: string; Seed: LongInt):string;
var
Count: Integer;
CrcVal: LongInt;
begin
CrcVal := Seed;
for Count := 1 to Length(s) do
CrcVal := TableCRC[Byte(CrcVal xor DWORD(Ord(s[Count])))] xor ((CrcVal shr 8) and $00FFFFFF);
Result := IntToHex(not(CrcVal), 8);
end;

应用实例:
procedure TfrmFinal.Button1Click(Sender: TObject);
var
str : string;
begin
MakeTable();
str := '01000B0000050000'; //01 00 0B 00 00 05 00 00这样也不行,
Memo1.Text := GetCrc32Str(Trim(str),8);
end;
这样求得的结果不对,麻烦大家帮忙看看俺这里出了什么问题,
100分送上,不成敬意!!
 
高手都去哪里了?
 
已经搞定了,
开始散发交朋友了,
俺在广东,
 
片分中。
 
接分中...
 
如果有兴趣的话,顺便讨论一下各位将来的打算,
写一辈子代码吗?
俺将来准备做生意,
 
好久没拿分了,呵呵……
[:D][:D][:D]
 
接分。。。。[:D]
 
怎么交朋友啊,QQ呢,MSN呢,群呢
 
QQ:869262069.欢迎各位加我。
 
接分中...
 
接分中﹐﹐﹐迷茫中。。。。。
 
等待中,渴望中。[:D]
 
我准备养猪去了,或者去打桩 哈哈哈
 
楼上的主意不错,养猪是个赚钱的路子唽
 
写一辈子,我没傻到那个程度,越写人越傻,我感觉是不是上辈子做缺德事,被罚的,写程序.一个头两个大.悲哀.但是为了先混口饭吃,不得不写.
问我今后怎么走,那你是问错了,饭还没入肚皮,怎么知道以后会不会饿死,所以还是将就着,只能等到,真的不要我们这号人的时候,自然就走了.
不是我没出息,只恨自己就只是这么一块料.
楼主,看在写这么多的份上,施舍点分吧.分口饭吃.!!!!!!
 
接分中。。。。。。
 
后退
顶部