'===================================================
'模块名称:CRC_CCITT校验函数
'创建日期:2013-3-21 测试通过
'输入参数:数组Buffer
'输出参数:CRC低16位:Int(CRC16_4(Buffer,Place,L) /256)
' CRC高16位:CRC16_4(Buffer,Place,L) Mod 256
' Place:当前数组下标
' L:校验数组长度
'修改记录:无
'===================================================
Public Function CRC16_4(Buffer() As Byte, Place As Integer, L As Integer) As Long
Const CRC_POLYNOM As Long = &H8408&
Const CRC_PRESET As Long = &HFFFF&
Dim CRC As Long, I As Long, J As Long
CRC = CRC_PRESET
For I = Place To Place + L - 1
CRC = CRC Xor Buffer(I)
For J = 0 To 7
If (CRC And 1) Then
CRC = (CRC \ 2) Xor CRC_POLYNOM
Else
CRC = (CRC \ 2)
End If
Next J
Next I
CRC16_4 = (Not CRC) And &HFFFF&
End Function
用法:
如:dim data(20) as byte,从data(5)算到data(10),那么Place=5,L=6.
如计算A0 1C 00 02 00 21 25 32的CRC_CCITT校验是47 FA
Dim data(20) as byte
data(0)=&H7E
data(1)=&H1C
data(2)=&H1C
data(3)=&H0
data(4)=&H2
data(5)=&H0
data(6)=&H21
data(7)=&H25
data(8)=&H32
data(9)=CRC16_4(data,1,8) Mod 256 'CRC高位&H47
data(10)=Int(CRC16_4(data,1,8) /256) ‘CRC低位&HFA转换为Delphi//CRC低16位:Trunc(Int(Calu_CRC16(data)/256))
//CRC高16位:Calu_CRC16(data) mod 256
function Calu_CRC16(pData:array of Byte):LongInt;
const
CRC_POLYNOM:LongInt=$8408;
CRC_PRESET:LongInt=$FFFF;
var
CRC,I,J:LongInt;
begin
CRC:=CRC_PRESET;
for I:=0 to Length(pData)-1 do
begin
CRC:=CRC xor pData[I];
for J:=0 to 7 do
begin
if ((CRC And 1)=1) then
begin
CRC:=(CRC div 2) xor CRC_POLYNOM;
end else
begin
CRC:=CRC div 2;
end;
end;
end;
Result:=(not CRC) and CRC_PRESET;
end;procedure TFrm_S_Func.btn1Click(Sender: TObject);
var
data:array[0..8] of Byte;
begin
data[0]:=$EE;
data[1]:=$00;
data[2]:=$00;
data[3]:=$00;
data[4]:=$00;
data[5]:=$01;
data[6]:=$20;
ShowMessage(IntToStr(Calu_CRC16(data)));//正确crc=$1013,现在=$98E1
end;转换为Delphi 计算以后总是算不对,是Delphi里面长整形CRC_POLYNOM:LongInt=$8408跟vb的Const CRC_POLYNOM As Long = &H8408&转换不对?delphiCRC_CCITTvbLongInt
解决方案 »
- 如何使用CreateOleObject方法调用word,但显示的时候是在delphi窗体里显示
- 世上绝无仅有的两份简历,你选哪一个?
- 100分问:向其它程序窗口的控件发送ctrl+任意热键出现的问题/另外程序多个实例怎么区分.
- ★★★解除网页鼠标右键锁定、限制所上网站,如何编程实现?★★★
- 如何防止访问冲突?
- 可能是毕设期间最后一个问题!100!
- vtxtauto_tlb控件在哪里?
- 哪有李维的<Delphi 5.X ADO_MTS_COM+高级程序设计篇>一书下载。
- 请教关于SQL2000数据库备份的问题?
- 怎样使dbgrid显示的字段的名称是中文的?
- delphi 需求如下:查询各个表中的数据列的数据类型,除int外,所有数据都要通过加密代码加密,代码写到如何读取类型所对应的列值时
- Delphi7下单线程中如何并发调用1个过程?如用线程池,如何操作及注意事项?
procedure TFrm_S_Func.btn1Click(Sender: TObject);
var
data:array[0..8] of Byte; //这里不对,应该为data:array[0..6] of Byte
begin
data[0]:=$EE;
data[1]:=$00;
data[2]:=$00;
data[3]:=$00;
data[4]:=$00;
data[5]:=$01;
data[6]:=$20;
ShowMessage(IntToHex(Calu_CRC16(data),4));//正确crc=$1013,现在=$98E1
end;