跳至正文
-
Subscribe to our newsletter & never miss our best posts. Subscribe Now!
BG6RSH's 随记.

我们总是在感叹昨天,忽视今天,幻想着明天中渡过,且过且珍惜.....

BG6RSH's 随记.

我们总是在感叹昨天,忽视今天,幻想着明天中渡过,且过且珍惜.....

  • 首页
  • 论坛
  • 随记
  • 编程
  • 软件
  • 留言
  • 首页
  • 论坛
  • 随记
  • 编程
  • 软件
  • 留言
关

搜索

  • https://www.facebook.com/
  • https://twitter.com/
  • https://t.me/
  • https://www.instagram.com/
  • https://youtube.com/
Subscribe
编程

两种CRC算法的Delphi源代码

作者 admin
2013年6月19日 1 分钟阅读
0

共有两种算法。下面这个纯计算出的:

Delphi/Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
function CalCRC8005(AData:array of Byte; AStart,AEnd:Integer): Word;
const
  GENP = $8005;
 
var
  crc:Word;
  i:Integer;
 
procedure CalOneByte(AByte:Byte);
var
  j:Integer;
  msb:Word;   //移出的最高位
  tmp:Word;
begin
  tmp:=AByte;
  tmp:=tmp shl 8;
  crc:=crc xor tmp;
 
  for j := 0 to 7 do
  begin
    msb:= crc and $8000;
    crc:=crc shl 1;
    if msb = $8000 then
      crc:= crc xor GENP;
  end;
end;
 
begin
  crc:=$FFFF;
  //crc:=$0000;
  for i := AStart to AEnd do
    CalOneByte(AData[i]);
  Result:=crc;
end;

下面是另一种查表法,结果与第一种一样

Delphi/Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
const
  CrcTable: array [0 .. 255] of word = ($0000, $8005, $800F, $000A, $801B,
    $001E, $0014, $8011, $8033, $0036, $003C, $8039, $0028, $802D, $8027, $0022,
    $8063, $0066, $006C, $8069, $0078, $807D, $8077, $0072, $0050, $8055, $805F,
    $005A, $804B, $004E, $0044, $8041, $80C3, $00C6, $00CC, $80C9, $00D8, $80DD,
    $80D7, $00D2, $00F0, $80F5, $80FF, $00FA, $80EB, $00EE, $00E4, $80E1, $00A0,
    $80A5, $80AF, $00AA, $80BB, $00BE, $00B4, $80B1, $8093, $0096, $009C, $8099,
    $0088, $808D, $8087, $0082, $8183, $0186, $018C, $8189, $0198, $819D, $8197,
    $0192, $01B0, $81B5, $81BF, $01BA, $81AB, $01AE, $01A4, $81A1, $01E0, $81E5,
    $81EF, $01EA, $81FB, $01FE, $01F4, $81F1, $81D3, $01D6, $01DC, $81D9, $01C8,
    $81CD, $81C7, $01C2, $0140, $8145, $814F, $014A, $815B, $015E, $0154, $8151,
    $8173, $0176, $017C, $8179, $0168, $816D, $8167, $0162, $8123, $0126, $012C,
    $8129, $0138, $813D, $8137, $0132, $0110, $8115, $811F, $011A, $810B, $010E,
    $0104, $8101, $8303, $0306, $030C, $8309, $0318, $831D, $8317, $0312, $0330,
    $8335, $833F, $033A, $832B, $032E, $0324, $8321, $0360, $8365, $836F, $036A,
    $837B, $037E, $0374, $8371, $8353, $0356, $035C, $8359, $0348, $834D, $8347,
    $0342, $03C0, $83C5, $83CF, $03CA, $83DB, $03DE, $03D4, $83D1, $83F3, $03F6,
    $03FC, $83F9, $03E8, $83ED, $83E7, $03E2, $83A3, $03A6, $03AC, $83A9, $03B8,
    $83BD, $83B7, $03B2, $0390, $8395, $839F, $039A, $838B, $038E, $0384, $8381,
    $0280, $8285, $828F, $028A, $829B, $029E, $0294, $8291, $82B3, $02B6, $02BC,
    $82B9, $02A8, $82AD, $82A7, $02A2, $82E3, $02E6, $02EC, $82E9, $02F8, $82FD,
    $82F7, $02F2, $02D0, $82D5, $82DF, $02DA, $82CB, $02CE, $02C4, $82C1, $8243,
    $0246, $024C, $8249, $0258, $825D, $8257, $0252, $0270, $8275, $827F, $027A,
    $826B, $026E, $0264, $8261, $0220, $8225, $822F, $022A, $823B, $023E, $0234,
    $8231, $8213, $0216, $021C, $8219, $0208, $820D, $8207, $0202);
 
var
  Form1: TForm1;
  CrcL, CrcH: byte;
 
implementation
 
{$R *.dfm}
 
procedure ResetCrc;
begin
  CrcL := $FF;
  CrcH := $FF;
end;
 
procedure UpdateCrc(const num: byte);
var
  table_addr: byte;
begin
  table_addr := (num xor CrcH);
  CrcH := (CrcTable[table_addr] shr 8) xor CrcL;
  CrcL := (CrcTable[table_addr] and $00FF);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  i0, s_len: integer;
  WrBuf: array [1 .. 32] of byte;
  s:string;
begin
  s:='';
  WrBuf[1] := $7F;
  WrBuf[2] := $80;
  WrBuf[3] := $01;
  WrBuf[4] := $07;
  //WrBuf[5] := $ef;
  //WrBuf[6] := $00;
  ResetCrc;
  for i0 := 2 to 4 do
    UpdateCrc(WrBuf[i0]); // 计算 Crc,0x7f 不参加 Crc 计算
  WrBuf[i0] := CrcL;
  inc(i0);
  WrBuf[i0] := CrcH;
  s_len := i0;
  for i0 := 1 to s_len do s:=s+inttohex(WrBuf[i0],2)+' ';
  label1.Caption := s;
end;
end.

标签:

CRCDelphi
作者

admin

关注我
其他文章
上一个

在中国肯定做不到的事“65岁高龄仍坚持每天编程”

下一个

Delphi2010中Ansi字符串与Unicode字符互转方法

暂无评论!成为第一个。

发表回复 取消回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理。

4条垃圾评论已被Akismet阻挡 (在新标签页中打开)

近期文章

  • www.tansoo.cn网站空间迁移至armbian主机
  • 在QT6中安装qtmqtt、qtopcua控件的方法
  • 你的 Python 环境或安装版没有 spyder‑kernels 模块或没有安装正确的版本 (>=
  • 用PYTHON爬网络小说源代码
  • QT5.15.2搭建ANDROID编译环境

近期评论

  • gg 发表在《Traccar服务软件高德地图适配版docker镜像安装教程》
  • admin 发表在《Traccar服务软件高德地图适配版docker镜像安装教程》
  • /api/positions/里addres 为什么是null啊? 发表在《Traccar服务软件高德地图适配版docker镜像安装教程》
  • gg 发表在《Traccar服务软件高德地图适配版docker镜像安装教程》
  • 9394 发表在《Traccar服务软件高德地图适配版docker镜像安装教程》

归档

  • 2025 年 6 月
  • 2023 年 6 月
  • 2022 年 10 月
  • 2021 年 5 月
  • 2021 年 4 月
  • 2020 年 11 月
  • 2020 年 10 月
  • 2020 年 6 月
  • 2019 年 11 月
  • 2019 年 8 月
  • 2019 年 6 月
  • 2019 年 1 月
  • 2018 年 12 月
  • 2018 年 11 月
  • 2017 年 9 月
  • 2016 年 7 月
  • 2016 年 5 月
  • 2015 年 12 月
  • 2015 年 4 月
  • 2015 年 1 月
  • 2014 年 12 月
  • 2014 年 11 月
  • 2014 年 10 月
  • 2014 年 9 月
  • 2014 年 8 月
  • 2014 年 7 月
  • 2014 年 6 月
  • 2014 年 5 月
  • 2013 年 10 月
  • 2013 年 9 月
  • 2013 年 8 月
  • 2013 年 7 月
  • 2013 年 6 月
  • 2013 年 5 月
  • 2013 年 4 月
  • 2013 年 3 月
  • 2013 年 2 月
  • 2013 年 1 月
  • 2012 年 12 月
  • 2012 年 11 月
  • 2012 年 10 月
  • 2012 年 6 月
  • 2012 年 3 月
  • 2011 年 8 月
  • 2011 年 5 月
  • 2011 年 4 月
  • 2011 年 3 月
  • 2011 年 1 月
  • 2010 年 8 月
  • 2010 年 6 月
  • 2010 年 4 月
  • 2010 年 3 月
  • 2010 年 2 月
  • 2010 年 1 月
  • 2009 年 12 月
  • 2009 年 11 月

分类

  • 编程
  • 软件
  • 随记

其他操作

  • 注册
  • 登录
  • 条目 feed
  • 评论 feed
  • WordPress.org

标签

aliyun Android CRC DBGridEh ddns Delphi EhLib ESP8266 GP328D gp338plus GP3688 Modbus phpbb python QT raspberry S7-SCL sapi speech SpVoice Synology traccar UART Unicode virtualbox vmware WGS84 wordpress ZeroTier 写频 动态IP 图片尺寸 地图 外挂编程 天气预报 导航 打印 扩频 拼音首字母 支票快打 树莓派 爬虫 百度地图 西门子PLC 车联网API

友情链接

  • 私有云论坛
  • 百度开放云
  • 主机管理
  • My Cloud
  • 智能家居技术论坛
  • 精灵云
  • 雅苑私站
Copyright 2026 — BG6RSH's 随记.. All rights reserved. Blogsy WordPress Theme