unit Main
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls
type
TForm1 = class(TForm)
Memo1: TMemo
Label1: TLabel
Label2: TLabel
Label3: TLabel
GenPoly8Edit: TEdit
GenPoly16Edit: TEdit
GenPoly32Edit: TEdit
TestCRC8Btn: TButton
TestCRC16Btn: TButton
TestCRC32Btn: TButton
CalCRC8Btn: TButton
CalCRC16Btn: TButton
CalCRC32Btn: TButton
CRC8ResultEdit: TEdit
CRC16ResultEdit: TEdit
CRC32ResultEdit: TEdit
procedure FormCreate(Sender: TObject)
procedure TestCRC16BtnClick(Sender: TObject)
procedure TestCRC8BtnClick(Sender: TObject)
procedure TestCRC32BtnClick(Sender: TObject)
procedure CalCRC16BtnClick(Sender: TObject)
procedure CalCRC8BtnClick(Sender: TObject)
procedure CalCRC32BtnClick(Sender: TObject)
private
public
end
var
Form1: TForm1
GenPoly32: DWord
GenPoly16: Word
GenPoly8: Byte
GenPoly4: Byte
CRC32Tab: array [0..255] of DWord
CRC16Tab: array [0..255] of Word
CRC8Tab : array [0..255] of Byte
implementation
{$R *.DFM}
function CalCRC16(data, crc, genpoly: Word): Word
var i: Integer
begin
crc := crc xor (data shl 8)
for i:=0 to 7 do
if (crc and $8000) <>0 then
crc := (crc shl 1) xor genpoly
else crc := crc shl 1
Result := crc
end
procedure InitCRC16Tab(genpoly: DWord)
var i: Integer
begin
for i:=0 to 255 do
CRC16Tab[i] := CalCRC16(i,0,genpoly)
end
function QuickCRC16(data, crc: Word): Word
begin
crc := CRC16Tab[(crc shr 8) xor data] xor (crc shl 8)
Result := crc
end
function CalCRC8(data, crc, genpoly: Byte): Byte
var i: Integer
begin
crc := crc xor data
for i:=0 to 7 do
if (crc and $01) <>0 then
crc := (crc shr 1) xor genpoly
else crc := crc shr 1
Result := crc
end
procedure InitCRC8Tab(genpoly: DWord)
var i: Integer
begin
for i:=0 to 255 do
CRC8Tab[i] := CalCRC8(i,0,genpoly)
end
function QuickCRC8(data, crc: Byte): Word
begin
crc := CRC8Tab[crc xor data]
Result := crc
end
function CalCRC32(data, crc, genpoly: DWord): DWord
var i: Integer
begin
crc := crc xor data
for i:=0 to 7 do
if (crc and $01) <>0 then
crc := (crc shr 1) xor genpoly
else crc := crc shr 1
Result := crc
end
procedure InitCRC32Tab(genpoly: DWord)
var i: Integer
begin
for i:=0 to 255 do
CRC32Tab[i] := CalCRC32(i,0,genpoly)
end
function QuickCRC32(data, crc: DWord): DWord
begin
crc := CRC32Tab[Byte(crc xor data)] xor (crc shr 8)
Result := crc
end
procedure TForm1.FormCreate(Sender: TObject)
begin
GenPoly8 := StrToInt(GenPoly8Edit.Text)
InitCRC8Tab(GenPoly8)
GenPoly16 := StrToInt(GenPoly16Edit.Text)
InitCRC16Tab(GenPoly16)
GenPoly32 := StrToInt(GenPoly32Edit.Text)
InitCRC32Tab(GenPoly32)
end
procedure TForm1.TestCRC16BtnClick(Sender: TObject)
var data, crc, crcstart: Word
begin
crcstart := $1234
Memo1.Clear
Memo1.Lines.Add('16bit CRC')
for data:=0 to 255 do
begin
crc := CalCRC16(data,crcstart,GenPoly16)
Memo1.Text := Memo1.Text + IntToHex(crc, 4) + ' '
end
Memo1.Lines.Add('')
Memo1.Lines.Add('16bit Quick CRC')
for data:=0 to 255 do
begin
crc := QuickCRC16(data,crcstart)
Memo1.Text := Memo1.Text + IntToHex(crc, 4) + ' '
end
end
procedure TForm1.TestCRC8BtnClick(Sender: TObject)
var data, crc, crcstart: Byte
begin
crcstart := $12
Memo1.Clear
Memo1.Lines.Add('8bit CRC')
for data:=0 to 255 do
begin
crc := CalCRC8(data,crcstart,GenPoly8)
Memo1.Text := Memo1.Text + IntToHex(crc, 2) + ' '
end
Memo1.Lines.Add('')
Memo1.Lines.Add('8bit Quick CRC')
for data:=0 to 255 do
begin
crc := QuickCRC8(data,crcstart)
Memo1.Text := Memo1.Text + IntToHex(crc, 2) + ' '
end
end
procedure TForm1.TestCRC32BtnClick(Sender: TObject)
var data, crc, crcstart: DWord
begin
crcstart := $12345678
Memo1.Clear
Memo1.Lines.Add('32bit CRC')
for data:=0 to 255 do
begin
crc := CalCRC32(data,crcstart,GenPoly32)
Memo1.Text := Memo1.Text + IntToHex(crc, 8) + ' '
end
Memo1.Lines.Add('')
Memo1.Lines.Add('32bit Quick CRC')
for data:=0 to 255 do
begin
crc := QuickCRC32(data,crcstart)
Memo1.Text := Memo1.Text + IntToHex(crc, 8) + ' '
end
end
function GetDataFromText(str: String): String
var i, p1, p2: Integer
begin
Result := ''
while str <>'' do
begin
i := 0
p1 := Pos(' ',str)
p2 := Pos(#13#10,str)
if p1=1 then
begin Delete(str,1,1)continueend
if p2=1 then
begin Delete(str,1,2)continueend
if (p1=0) and (p2=0) and (str<>'') then
begin
i := StrToIntDef('$'+str,0)
Delete(str,1,Length(str))
end
if ((p1>0) and (p2=0)) or
((p1>0) and (p2>0) and (p1<p2)) then
begin
i := StrToIntDef('$'+Copy(str,1,p1-1),0)
Delete(str,1,p1)
end
if ((p1=0) and (p2>0)) or
((p1>0) and (p2>0) and (p1>p2)) then
begin
i := StrToIntDef('$'+Copy(str,1,p2-1),0)
Delete(str,1,p2+1)
end
Result := Result + Chr(i)
end
end
procedure TForm1.CalCRC16BtnClick(Sender: TObject)
var
i: Integer
databuf: String
data, crc: Word
begin
databuf := GetDataFromText(Memo1.Text)
crc := 0
for i:=1 to Length(databuf) do
begin
data := Ord(databuf[i])
crc := CalCRC16(data,crc,GenPoly16)
end
CRC16ResultEdit.Text := 'CRC16 = ' + IntToHex(crc,4)
end
procedure TForm1.CalCRC8BtnClick(Sender: TObject)
var
i: Integer
databuf: String
data, crc: Byte
begin
databuf := GetDataFromText(Memo1.Text)
crc := 0
for i:=1 to Length(databuf) do
begin
data := Ord(databuf[i])
crc := CalCRC8(data,crc,GenPoly8)
end
CRC8ResultEdit.Text := 'CRC8 = ' + IntToHex(crc,2)
end
procedure TForm1.CalCRC32BtnClick(Sender: TObject)
var
i: Integer
databuf: String
data, crc: DWord
begin
databuf := GetDataFromText(Memo1.Text)
crc := 0
for i:=1 to Length(databuf) do
begin
data := Ord(databuf[i])
crc := CalCRC32(data,crc,GenPoly32)
end
CRC32ResultEdit.Text := 'CRC32 = ' + IntToHex(crc,8)
end
end.
已知信息位为1100,生成多项式G(x) = x3+x+1,求CRC码。
M(x) = 1100 M(x)*x3 = 1100000 G(x) = 1011
M(x)*x3 / G(x) = 1110 + 010 /1011 R(x) = 010
CRC码为: M(x)*x 3+R(x)=1100000+010 =1100010
其原理是:CRC码一般在k位信息位之后拼接r位校验位生成。编码步骤如下:
(1)将待编码的k位信息灶橘高表示成多项式 M(x)。
(2)伍袭将 M(x)左移 r 位,得到 M(x)*xr 。
(3)用r+1位的生成多项式G(x)去除M(x)*xr 得到余数R(x)。
(4)将M(x)*xr 与R(x)作模2加,得到CRC码。
扩展资料:
CRC校验码计算详解:采用CRC进行差错检验,生成多项式为G(X)=X4+X+1,信息码字为10110,则计算出的CRC校验码是:A. 0000 B. 0100 C. 0010 D.1111
符号表示假定:多项式和多项式的系数排列均用相同的符号表示,如
G(X)= X4+X+1
G(X)=10011
已知条件如下:
原码字记做M(X),即:M(X) = 10110
生成多项式记做G(X),即:G(X) = 10011
G(X)的最高阶隐尺数记做r,此处r = 4
CRC的本质是模-2除法的余数,采用的除数不同,CRC的类型也就不一样。通常,CRC的除数用生成多项式来表派前示。 最常用的CRC码及生成多项式名称生成多项式。
CRC-12:
CRC-16:
CRC-CCITT:
CRC-32:
CRC校验腔羡世实用程序库 在数据存储和数据通讯领域,为了保证数据的正确,就不得不采用检错的手段。在诸多检错手段中,CRC是最著名的一种。CRC的全称是循环冗余校验。
扩展资料
通常的CRC算法在计算一个数据段的CRC值时,其CRC值是由求解每个数值的CRC值的和对CRC寄存器的值反复更新而得到的。这样,求解CRC的速度较慢。通过对CRC算法的研究,我们发现:一个8位数据加到16位累加器中去,只有累加伍肢器的高8位或低8位与数据相作用,其结果仅有256种可能的组合值。
因而,我们可以用查表法来代替反复的运算,这也同样适用于CRC32的计算。本文所提供的程序库中,函数crchware是一般的16位CRC的算法。mk-crctbl用以在内存中建立一个CRC数值表。
参考资料来源:百度百科-CRC32
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)