各路大虾,有没有delphi版的crc16校验函数,我写了一个,不太正确 (100分)

  • 主题发起人 主题发起人 shibaoping
  • 开始时间 开始时间
S

shibaoping

Unregistered / Unconfirmed
GUEST, unregistred user!
有谁能写个吗?
 
没有必要去写,去http://www.delphi-jedi.org/下载一个JCL,里面有crc16的详细实现,
还包括了纠错功能。JCL是一套非常不错的代码库,涵盖了方方面面,可以省不少事。
另外,CRC有几种实现方式,就算实现方式一样,初始值不一样,结果也会不一样,所以
未必就是你错了,有可能都是正确的。
 
我抄的,你看看行不行

{ Return a 16-bit CRC number For binary data. }
Function Crc16(Var Data; wo_Size : Word) : Word; Assembler;
Asm
push ds
xor dx, dx
lds si, Data
mov bx, wo_Size
@L1:
xor ah, ah
lodsb
mov cx, 8
shl ax, cl
xor dx, ax
mov cx, 8
@L2:
shl dx, 1
jnc @L3
xor dx, $1021
@L3:
loop @L2
dec bx
jnz @L1
pop ds
mov ax, dx
end; { Crc16. }
 
DoubleWood,正在下

arnew,我还没试出来

 
DoubleWood.我怎么没找到调用crc16的例子亚
 
看看我写的哪错了
function CRC16_(const AData: array of Byte): String;
var
I, Flag: Integer;
CRC16High, CRC16Low, SaveHigh, SaveLow: Byte;
CL,CH : Byte;
begin
CRC16High:= $FF;
CRC16Low:= $FF;
CL := $1;
CH := $A0;

for I:= 0 to High(AData) do
begin
CRC16Low:= CRC16Low xor AData;
for Flag:= 0 to 7 do
begin
SaveHigh:= CRC16High;
SaveLow:= CRC16Low;
CRC16High:= CRC16High shr 1;
CRC16Low:= CRC16Low shr 1;
if (SaveHigh and $1) = $1 then
CRC16Low:= CRC16Low or $80;
if (SaveLow and $1) = $1 then
begin
CRC16High:= CRC16High xor CH;
CRC16Low:= CRC16Low xor CL;
end;
end;
end;
Result:= IntToHex(CRC16High, 2) + IntToHex(CRC16Low, 2);
end;
 
搞定了,写的没有错,只是在调用时,应将动态数组线分配好应有的空间,否则初始值会是随机数,于是产生的crc码酒会总是改变。

不过等时间充裕了,我还是想用DoubleWood推荐的,不过现在不会使用,大家用过的,介绍介绍吧,我先不结束
 
lp414, 什么意思?
 
多人接受答案了。
 
后退
顶部