CRC16-CCITT C语言代码

代码如下,使用空间换时间的方法

#define CRC16_CCITT_SEED       0xFFFF   // 该位称为预置值,使用人工算法(长除法)时 需要将除数多项式先与该与职位 异或 ,才能得到最后的除数多项式
#define CRC16_CCITT_POLY16     0x1021  // 该位为简式书写 实际为0x11021
unsigned short crc16_ccitt(unsigned char *pbuf, size_t len);//*pbuf为数据指针,len为数据长度
/*
*CRC 余式表
*/
static unsigned short crc16_ccitt_table[256] =
{
    0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
    0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
    0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
    0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
    0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
    0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
    0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
    0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
    0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
    0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
    0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
    0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
    0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
    0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
    0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
    0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
    0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
    0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
    0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
    0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
    0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
    0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
    0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
    0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
    0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
    0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
    0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
    0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
    0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
    0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
    0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
    0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
};

// /*
// *CRC校验码生成函数
// */
unsigned short crc16_ccitt(unsigned char *pbuf, size_t len)
{
    unsigned short crc = CRC16_CCITT_SEED;

    while (len-- > 0)
    {
        crc = crc16_ccitt_table[(crc >> 8 ^ *pbuf++) & 0xff] ^ (crc << 8);
    }

    return crc;

}

测试一下

int main(void)
{
    unsigned char string[8]= {0x02,0x0A,0x00,0x03,0xE6,0x02,0x08,0x03};
    unsigned short CRC_Value;

    CRC_Value =  crc16_ccitt(string,8);//得到CRC值
    printf("CRC_Value : %04X\n",CRC_Value) ;//输出结果为16进制

    system("pause");
    return 0;
}

结果如下:

时间: 2024-10-11 05:34:45

CRC16-CCITT C语言代码的相关文章

2048游戏C语言代码

听说2048游戏实现起来很easy! 所以今天就试了试!确实不太难,要想编的很成功,也不是太容易!有很多细节需要考虑! 下面是我自己设计的代码,估计里面会漏洞百出!希望路过大神能指点一二! #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<time.h> #define WIN 256 // 可以修改决定游戏输赢的值 // 矩阵数组 int num[4][4]={0,0,0,0,0

HTML5 脚本 语言代码 URL 符号实体 ASCII码 颜色

1.HTML<noscript> 标签 <noscript> 标签提供无法使用脚本时的替代内容,比方在浏览器禁用脚本时,或浏览器不支持客户端脚本时. <noscript>元素可包含普通 HTML 页面的 body 元素中能够找到的所有元素. 只有在浏览器不支持脚本或者禁用脚本时,才会显示 <noscript> 元素中的内容: 2.语言代码:http://www.runoob.com/tags/html-language-codes.html 3.URL -

HTML之一语言代码

HTML的lang属性可用于网页或部分网页的语言.这对搜索引擎和浏览器是有帮助的. ISO 639-1语言代码   可以在HTML的lang属性中使用它们. Language---------------------------------ISO Code English en(语言代码) 不同于HTTP Header之Content-Language/Accept-Language 以及meta之<meta http-equiv="Content-Language" conte

编程精粹--编写高质量C语言代码(6):对程序进行逐条跟踪

发现程序错误最好的方法就是执行程序.在程序执行过程中,我们利用我们的眼睛,或者通过我们编写的断言和子系统一致性检查等自动测试的工具来发现错误.虽然断言和子系统检查都很有用,但是如果程序员事先没有想到应该对某些问题进行检查,那么也就无法保证程序没有问题. 程序员可以在代码中设置断点,一步步跟踪代码的运行,观察输入变为输出的过程.程序员测试其程序最好的方法就是对程序进行逐条跟踪,对中间的结果进行认真的查看.对代码进行逐条跟踪是需要时间的,但它同编码比,只是一小部分.一旦逐条地跟踪代码成为习惯后,我们

Latex中插入C语言代码

Latex是一个文本排版的语言,能排版出各种我们想要的效果.而且用代码排版的优点是易于修改板式,因此在文本内容的排版时,Latex应用十分广泛. 当我们需要在Latex中插入代码时,就需要用到 \usepackage{listings} 宏包.例如插入一个简单的C语言代码 #include <stdio.h> int main(int argc, char ** argv) { printf("Hello, world!\n"); return 0; } 要将上面 Hell

Android安全防护之旅---带你把Apk混淆成中文语言代码

一.前言 最近想爆破一个app,没有加壳,简单的使用Jadx打开查看源码,结果把我逗乐了,代码中既然都是中文,而且是一些比较奇葩的中文字句,如图所示: 瞬间感觉懵逼了,这app真会玩,我们知道因为Java语言是支持双字符的,所以可以将包名,类名,变量名,方法名定义成中文,或者其他国家的语言都可以的.所以本身这种做法是不会运行报错的,比如下面我们新建一个Java工程看一下效果: 运行是没有任何问题的.看到这里的时候觉得很好奇,所以就先没去看他的源码了,而是想着怎么实现这种混淆的功能.下面就来介绍一

C语言代码里不能用goto?

当我学C语言时,老师整天告诉我:"不要使用goto, 这是一个坏习惯, 这种写法很烂,而且很危险!"等等. 但是为什么那么多内核程序员那么喜欢用goto呢? 在这段linux内核 https://github.com/torvalds/linux/blob/master/kernel/sched/clock.c  代码里,我觉得可以用简单的一个while替换掉,如: while(condition) { } //或 do { }while(condition); 注:这段代码来自tor

让你的Windows不断重启的C语言代码

原文:让你的Windows不断重启的C语言代码 没有写Linux的原因是因为搞不定Linux下的权限问题,而Windows下基本上使用电脑的用户都是管理员,所以钻个空了,不多说下面是代码#include "stdio.h"#include "process.h"int copy_file(char *start,char *end){    FILE *input,*output;    if(((input=fopen(start,"rb"))

编程精粹--编写高质量C语言代码(3):自己设计并使用断言(二)

接着上一遍文章<<编程精粹--编写高质量C语言代码(2):自己设计并使用断言(一)>>,继续学习如何自己设计并使用断言,来更加容易,更加不费力地自动寻找出程序中的错误. 首先看一个简单的压缩还原程序: byte* pbExpand(byte *pbFrom,byte *pbTo,size_t sizeFrom) { byte b, *bpEnd; size_t size; pbEnd=pbFrom+sizeFrom; while(pbFrom<pbEnd) { b=*pbFr

编程精粹--编写高质量C语言代码(1):假想编译程序

编译程序仅仅能查找出程序的语法错误,而对于"数组越界访问","对空指针解引用"等错误,编译程序是束手无策的.同时我们知道测试人员所使用的黑箱测试方法所能做的只是往程序里填数据,并看它弹出什么.这就决定了对程序错误的检测可能需要点运气. 假如编译程序能够检测出"数组越界访问","差一错误","空指针"等等错误,那么编写无错代码其实就要简答多了. 所以我们需要一个思维转变: 不要光依赖黑箱测试方法,还应该试着去