计算crc的完整程序

计算crc的完整程序,第1张

我给你delphi的饥枣CRC算法,烂歼拆这个文改腊件可以直接使用

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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8262743.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存