求delphi高手转换个C语言的CRC16算法,算法如下 5C
 unsigned short CalcCrc16(unsigned char * pData, int nLength)
{
unsigned short cRc_16 = 0x0000;
const unsigned short cnCRC_16 = 0x8005;
unsigned long cRctable_16[256];
unsigned short i,j,k;
for (i=0,k=0; i<256; i++,k++)
{
cRc_16 = i<<8;
for (j=8;j>0;j--)
{
if (cRc_16&0x8000)
cRc_16 = (cRc_16<<=1)^cnCRC_16;
else
cRc_16<<=1;
}
cRctable_16[k] = cRc_16;
}
while (nLength>0)
{
cRc_16 = (cRc_16 << 8) ^ cRctable_16[((cRc_16>>8) ^ *pData) & 0xff];
nLength--;
pData++;
}
return cRc_16;
}

2个回答

https://blog.csdn.net/2004v2004/article/details/6311586

把其中的 crc:=crc and $7FFF; 和 GENP=$A001; 换成你的 0000 和 8005

function CalcCrc16(pData:pointer;nLength:integer):word;
const cnCRC_16 = $8005;
var cRc_16 :word;
cRctable_16:array [0..255] of longword;
i,j,k:word;
p:^byte;
begin
p:=pData;
cRc_16:=0;
for i:=0 to 255 do
begin
k:=i;
cRc_16 := i shl 8;
for j:=8 downto 1 do
begin
if boolean(cRc_16 and $8000) then cRc_16 := (cRc_16 shl 1) xor cnCRC_16
else cRc_16 := (cRc_16 shl 1);
end;
cRctable_16[k] := cRc_16;
end;
while (nLength>0) do
begin
cRc_16 = (cRc_16 shl 8) xor cRctable_16[((cRc_16 shr 8) xor p^) and $ff];
dec(nLength);
inc(p);
end;
return cRc_16;
end;

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
CRC16算法学习笔记
一.CRC原理 CRC(Cyclic Redundancy Check)即循环冗余校检码,和奇偶校检码一样,是用来检验数据传输的错误的,其原理用到的是多项式除法。 首先一串比特流,可以表示为一个F2域上的多项式,比如10110110 可以表示为g(x) = x^7 + x^5 +x^4 + x^2 + x^1 ,我们所要做的是找到一个不可约多项式,比如h(x) = x^8+x^6+x^4+x^3
基于MODBUS 协议的CRC16程序实现
ModBus 通信协议的 CRC ( 冗余循环校验码含2个字节, 即 16 位二进制数。CRC 码由发送设备计算, 放置于所发送信息帧的尾部。接收信息设备再重新计算所接收信息 (除 CRC 之外的部分)的 CRC, 比较计算得到的 CRC 是否与接收到CRC相符, 如果两者不相符, 则认为数据出错。 1) 预置 1 个 16 位的寄存器为十六进制FFFF(即全为 1) , 称此寄存器为 CR
CRC16算法之一:CRC16-CCITT-FALSE算法的java实现
CRC16算法系列文章: CRC16算法之一:CRC16-CCITT-FALSE算法的java实现 CRC16算法之二:CRC16-CCITT-XMODEM算法的java实现 ...
CRC16常见几个标准的算法及C语言实现
CRC16常见的标准有以下几种,被用在各个规范中,其算法原理基本一致,就是在数据的输入和输出有所差异,下边把这些标准的差异列出,并给出C语言的算法实现。CRC16_CCITT:多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在前,高位在后,结果与0x0000异或CRC16_CCITT_FALSE:多项式x16+x12+x5+1(0x1021),初始值0xFFFF,低位在后,...
CRC16算法实现(C语言)
CRC is short for Cyclic Redundancy Check.A cyclic redundancy check (CRC) is a type of function that takes as input a data stream of any length and produces as output a value of a certain fixed size.
如何使用Delphi编写Modbus RTU CRC16的校验码
如何使用Delphi编写Modbus RTU CRC16的校验码
CRC16校验的c语言实现
使用c语言和查表法来实现CRC16 (IBM标准)
【算法集中营】CRC16 三种算法及c实现
标准CRC生成多项式如下表:   名称       生成多项式             简记式*  标准引用    CRC-4       x4+x+1                  3         ITU G.704    CRC-8       x8+x5+x4+1              0x31                       CRC-8       x8+x
CRC-16/MODBUS 校验位计算
实验指令: 前23位表示 信息头 + 信息内容。24,25位是待计算的校验位。26位是结束码 7E 01 00 00 01 10 02 00 27 00 0C 00 02 00 00 00 00 00 50 00 3C 00 03 90 0B 0D 在线计算 代码实现 #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;Windows.h&amp;gt; UI...
CRC16校验C语言程序源码
最近忙着做一个触摸屏和单片机之间的通讯,主要使用了Modbus RTU 协议,在协议用到了 CRC16 校验,所以在网上找了很多资料,个人感觉这篇文章写的比较好,所以转载过来学习学习。。。   //CRC16校验在通讯中应用广泛,这里不对其理论进行讨论,只对常见的3种 //实现方法进行测试。方法1选用了一种常见的查表方法,类似的还有512字 //节、256字等查找表的,至于查找表的
crc16 ccitt 单片机与java匹配算法
/* * Description :提供CRC16校验函数采用CRC16-CCITT *多项式为 x^16 + x^12 + x^5 + 1 */ //CRC16-CCITT查找表 const unsigned short crc16_table[256] = { 0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7
MODBUS协议CRC16校验的C程序 源代码
MODBUS是工业领域广泛使用的通信协议,此为MODBUS协议CRC16校验的一段C程序供你参考。
CRC16校验C语言程序源码(转载)
CRC16校验C语言程序源码(转载) (2012-09-15 19:33:15) 标签: 杂谈 分类: 电子技术 最近忙着做一个触摸屏和单片机之间的通讯,主要使用了Modbus RTU 协议,在协议用到了 CRC16 校验,所以在网上找了很多资料,个人感觉这篇文章写的比较好,所以转载过来学习学习。。。   //CRC16校验在通讯中应用广泛,这里不对其理论进行讨论,只对常见的3种 //实
安卓能用的modebus CRC16计算,附上对应的C语言的CRC16
最近写安卓串口通信需要用到modebus 的crc16通信,网上找了很多都是字符串的,我需要byte的,由于java没有无符号数,转换有点小麻烦,对着C一部一部测试 代码如下: //java int CRC16_Check(byte Pushdata[],int length) { int Reg_CRC=0xffff; int temp; int i,j; f
java实现CRC16算法与C算法一致
java实现CRC16算法与C算法一致
linux内核中抽取的crc16的算法
// crc16.cpp : Defines the entry point for the console application. // #include "stdafx.h" /* * crc16.c * * This source code is licensed under the GNU General Public License, * Version 2. S
得到CRC16校验码的常见几个标准的算法及C语言实现
CRC16常见的标准有以下几种,被用在各个规范中,其算法原理基本一致,就是在数据的输入和输出有所差异,下边把这些标准的差异列出,并给出C语言的算法实现。 CRC16_CCITT:多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在前,高位在后,结果与0x0000异或 CRC16_CCITT_FALSE:多项式x16+x12+x5+1(0x1021),初始值0xFFFF,低...
Modbus CRC16校验算法--查表法(已经过本人测试,工作良好)
代码如下: uchar auchCRCHi[]= { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0
delphi及C中CRC16的实现
CRC16算法的实现,使用delphi及C两种语言
crc16 校验代码C语言实现 和原理分析
typedef    unsigned char     uchar;  typedef    unsigned int      uint;  typedef    unsigned short      uInt16; uint crc;                  // CRC 码 uint crc16l(uchar *ptr,uchar len)        // ptr
CRC16 校验算法
1、循环校验码(CRC码): 是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。 2、生成CRC码的基本原理: 任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。 标准CRC生成多项
非多项式CRC16校验算法
#define CRC_PRESET      0xffff #define CRC_POLYNOM     0xa001//电量CRC16的多项式 #define CRC_SPOLYNOM    0x8408//基站的多项式,最后使用基站CRC校验码 #define CRCGEN          0x1021//CRC16的多项式 /**********************
Java CRC16 校验代码 和 与之对应的C代码
最近在做一个安卓蓝牙项目,用到modbus通讯协议需要CRC16算法,现将该算法的c代码和Java版记录下来,分享给大家: C代码: const uint8_t chCRCHTalbe[] =                                 // CRC 高位字节值表             {                     0x00, 0xC1,
CRC原理详解(附crc16校验代码)
参考链接: https://www.cnblogs.com/esestt/archive/2007/08/09/848856.html Cyclic Redundancy Check循环冗余检验,是基于数据计算一组效验码,用于核对数据传输过程中是否被更改或传输错误。 算法原理 假设数据传输过程中需要发送15位的二进制信息g=101001110100001,这串二进制码可表示
java CRC16校验,原版C++,改编成java
 /* * crc校验,输入一个数组,返回一个数组,返回的数组比原数组 * 多了两个字节,也就是两个校验码,低字节在前,高字节在后. */public class CRC16 { public static int[] crc(int[] data){  int[] temdata=new int[data.length+2];  //unsigned char alen = *aStr – 2;
CRC16-CCITT C语言实现函数
CRC16校验:校验采用CRC16,多项式为X16+X12+X5+1,初始字节全部设置为0xFF,对控制代码、数据长度和数据部分做校验;
delphi编程CRC算法的实现
http://blog.csdn.net/aroc_lo/article/details/6097393   uses Windows,SysUtils,Classes; const //Crc32表 Table:Array[0..255] of DWORD= ( $00000000, $77073096, $EE0E612C, $990951BA,
CRC16(查表法)C语言和Java语言的验证
c语言: #include "main.h" code unsigned int crc_ta[] = { 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0
CRC16(查表法)在c语言和Java的验证
c语言: const unsigned short crc16_table[256] = { 0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7, 0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef, 0x
1142: 【C语言训练】立方和不等式
题目描述 试求满足下述立方和不等式的m的整数解。 1^3+2^3+...+m^3〈=n 输入 正整数n 输出 不等式的整数解 样例输入 10 样例输出 2 提示 这题通过率不足5成,感觉不是很难。 本题算法如下:  对指定的n,设置求和循环,从i=1开始,i递增1取值,把i3(或i*i*i)累加到s,直至s>=n,脱离循环作相应的打印输出。
CRC16校验原理及实现
CRC码由发送端计算,放置于发送信息报文的尾部。接收信息的设备再重新计算接收到信息报文的CRC,比较计算得到的CRC是否与接收到的相符,如果两者不相符,则表明出错。 校验码的计算多项式为(X16 + X15 + X2 + 1)。具体CRC16码的计算方法是: 1.预置1个16位的寄存器为十六进制FFFF(即全为1);称此寄存器为CRC寄存器; 2.把第一个8位二进
计算ModBus CRC 校验码(delphi实现)
真后悔当初网络课没好好学,最近在编一个程序遇到一个CRC校验码的计算,左看右看,以前没有接触过这方面的编程,没办法,还好找了一大堆文字叙述的材料,终于搞定了.­我的CRC的多项式是以ModBus 的A001(1010 0000 0000 0001) ­nit Unit1; ­interface ­uses ­  Windows, Messages, SysUtils, Va
crc16-ccitt C语言代码
crc16-ccitt 通过查表法实现,运算速度比较快,初始值为0xffff,并且是基于标准C语言的,并且已将CRC16运行程序封装成函数,只需要调用就好了,移植性强。
CRC16(modbus)校验
CRC16(循环冗余校验),CRC16有很多种,此处的算法主要是用于计算modbus协议通信时的校验码。 //用于CRC校验 const char auchCRCHi[256]={ 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x0
CRC代码算法实现-CRC-16 MODBUS代码实验
#include "stdio.h" unsigned char auchCRCHi[]= { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC
CRC校验的理解和C语言实现
1、CRC是什么 CRC检验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个检验码r位(就是CRC码),附在信息后面,构成一个新的二进制码序列数共(k+r)位,最后发送出去。接收端根据同样的规则校验,以确定传送中是否出错。接收端有两种处理方式:1、计算k位序列的CRC码,与接收到的CRC比较,一致则接收正确。2、计算整个k+r位的CRC码,若为0,则接收正确
各种CRC16校验C语言程序源码
CRC16校验在通讯中应用广泛,这里不对其理论进行讨论,只对常见的3种实现方法进行测试。方法1选用了一种常见的查表方法,类似的还有512字节、256字等查找表的,至于查找表的生成,这里也略过。
常用数据校验源代码(CRC8 CRC16 和校验 异或校验)
文档中包含了CRC8位数据校验 CRC16位数据校验 和校验 异或校验等常用校验方式,使用C++代码编写,很实用。
JAVA实现CRC16算法
public static int get_crc16 (byte[] bufData, int buflen, byte[] pcrc) { int ret = 0; int CRC = 0x0000ffff; int POLYNOMIAL = 0x0000a001; int i, j; if (buflen == 0) { return ret; } for
CCITT标准CRC-16计算C源代码
origin: http://blog.chinaunix.net/uid-20416869-id-173135.html /******该文件使用查表法计算CCITT 标准的CRC-16检验码,并附测试代码********/ #include  #define CRC_INIT 0xffff   //CCITT初始CRC为全1 #define GOOD_CRC 0xf0b8   //
delphi 版CRC16 查表算法
国为一个项目的原因需要delphi 版CRC16 查表算法,找了好久了,很多都不能用,有些算出来也不对。网上其它地方,需要的话就下吧。我的Delphi2009下测试能用。
CRC16自定义校验查表法
public class CRC16 { //校验公式为0x1021 private static int[] CRC16Table = { /* CRC16 余式表 */ 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1
Java CRC 16位校验算法(仿C++)
记录一版Java  16 位CRC的校验算法, 参照C++算法的copy ... C++版: unsigned short count_CRC(unsigned char *addr, int num) { unsigned short CRC = 0xFFFF; int i; while (num--) { CRC ^= *addr++; for (i = 0;
16位CRC查表法的简单使用方法
CRC16函数返回校验码 16位CRC简单使用程序#include<stdio.h> #include<stdlib.h> typedef unsigned int uint16; typedef unsigned char uint8;const uint8 auchCRCHi[] = { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41
CRC循环校验码c语言实现
http://forum.eepw.com.cn/thread/207575/1
【字符串处理算法】字符串转换为整数的算法设计及C代码实现
一、需求描述输入一个由数字构成的字符串,编写程序将该字符串转换为整数并输出。例如,如果输入的字符串是“12345”,那么输出的整数是12345。注意,不要使用C语言的库函数atoi。 二、算法设计我们都知道,如果给定一个整数123,那么其表示方法是:123=1*100+2*10+3。也就是说,一个整数是由其各位上的数字按照位数求和组成的。因此,这个需求的解决方法很简单,只要将字符串中的各位数字按照
几种求CRC-CCITT的方法 [C/C#]
// 所有原创文章转载请注明作者及链接// blackboycpp(AT)gmail.com// QQ群: 135202158   方法1:将存有数据的字节数组进行逐位计算,求得字节形式的CRC void crc16(byte d[], int len)<img id="_30_465_Open_Image"
用c语言实现 将一般算术表达式转化为逆波兰表达式,并求逆波兰表达 式的值
#include&amp;lt;stdio.h&amp;gt;#include&amp;lt;stdlib.h&amp;gt;#define MAX_SIZE 100typedef char ElemType;struct Stack{           ElemType data[MAX_SIZE]; int top;}MyStack;struct Stack_data{ double data[MAX_SIZE]; int...
Modbus CRC16校验算法--查表法(经过测试,工作良好)
转自:http://blog.csdn.net/zgrjkflmkyc/article/details/41073435 代码如下: uchar auchCRCHi[]= { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01
查表法的crc校验算法
/* * Copy right : * File name : CRC16.c * Author : Roger.luo * version : V1.0 * Modified date : 2014/6/14 * Description :提供CRC16校验函数采用CRC16-CCITT *多项式为 x^16 + x^12 + x^5 + 1
相关热词 c#时间格式化 不带- c#替换字符串中指定位置 c# rdlc 动态报表 c# 获取txt编码格式 c#事件主动调用 c#抽象工厂模式 c# 如何添加类注释 c# static块 c#处理浮点数 c# 生成字母数字随机数
立即提问