IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> CRC16,代码模块+验证工具教程(C/C++、C#) -> 正文阅读

[C++知识库]CRC16,代码模块+验证工具教程(C/C++、C#)


代码模块

C/C++

/*******************************************************************************
Function:    calculate_crc16
Description: 通用的16位CRC校验算法
Input:       wCRCin:CRC16算法的初始值
             wCPoly:特征多项式
             wResultXOR:结果异或值
             input_invert:输入值是否反转
             ouput_invert:输出值是否反转
             puchMsg:开始校验的数据的起始地址
             usDataLen:校验的数据长度
Output:      无输出
Return:      16位CRC校验结果
Others:      example_1:CRC-16/CCITT由本函数实现则填充参数如下:
             calculate_crc(0, 0x1021, 0, true, true, puchMsg, usDataLen)
             
             example_1:CRC-16/CCITT-FALSE由本函数实现则填充参数如下:
             calculate_crc(0xFFFF, 0x1021, 0, false, false, puchMsg, usDataLen)
*******************************************************************************/
quint16 calculate_crc16(quint16 wCRCin, quint16 wCPoly, quint16 wResultXOR,
                        bool input_invert, bool ouput_invert, const char *puchMsg, int usDataLen)
{   
    quint8 wChar = 0;
    while (usDataLen--)
    {
        wChar = *(puchMsg++);
        if(input_invert) /* 输入值反转 */
        {
            quint8 temp_char = wChar;
            wChar = 0;
            for(int i = 0; i < 8; ++i)
            {
                if(temp_char & 0x01)
                    wChar |= 0x01 << (7 - i);
                temp_char >>= 1;
            }
        }
        wCRCin ^= (wChar << 8);
        for (int i = 0; i < 8; i++)
        {
            if (wCRCin & 0x8000)
                wCRCin = (wCRCin << 1) ^ wCPoly;
            else
                wCRCin = wCRCin << 1;
        }
    }

    if(ouput_invert)
    {
        quint16 temp_short = wCRCin;
        wCRCin = 0;
        for(int i = 0; i < 16; ++i)
        {
            if(temp_short & 0x01)
                wCRCin |= 0x01 << (15 - i);
            temp_short >>= 1;
        }
    }
    return (wCRCin ^ wResultXOR);
}

C#

/// <summary>
/// this is the CCITT CRC 16 polynomial X^16  + X^12  + X^5  + 1.
/// This works out to be 0x1021, but the way the algorithm works
/// lets us use 0x8408 (the reverse of the bit pattern).  The high
/// bit is always assumed to be set, thus we only use 16 bits to
/// represent the 17 bit value.
/// </summary>
/// <param name="p_data">Tab of BYTE</param>
/// <param name="p_length">Length of tab</param>
/// <returns>CRC 16</returns>
public static ushort crc16(byte[] p_data, ushort p_length)
{
	byte i;
    uint indexData = 0;
    ushort data;
    ushort crc = 0xffff;
    const ushort POLY = 0x8408;

    if (p_length == 0)
    return (ushort)(~crc);
    do
    {
    	data = (ushort)(0xff & p_data[indexData++]);
        for (i = 0; i < 8; i++)
        {
        	if (((crc & 0x0001) ^ (data & 0x0001)) != 0)
            	crc = (ushort)((crc >> 1) ^ POLY);
            else crc >>= 1;
            data >>= 1;
         }
     } while (--p_length > 0);
     crc = (ushort)~crc;
     data = crc;
     crc = (ushort)((crc << 8) | (data >> 8 & 0xff));
     return (crc);
}

验证工具

工具下载

工具下载链接

数据验证

多项式:0x1021,初始值:0xFFFF,输入翻转:False,输出翻转:False,结果异或值:0x0000
源数据:

AA 55 00 00 82 2E 39 39 2C 2C 2C 2C 2C 2C 2A 35 36 0D 0A 24 47 4E 52 4D 43 2C 2C 56 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 4E 2A 34 44 0D 0A 24 47 4E 47 47 41 2C 2C 2C 2C 2C 2C 30 2C 30 30 2C 39 39 2E 39 39 2C 2C 2C 2C 2C 2C 2A 35 36 0D 0A 24 47 4E 52 4D 43 2C 2C 56 2C 2C 2C 2C 2C 2C 2C 2C 2C 2C 4E 2A 34 44 0D 0A 24 47 4E 47 47 41 2C 2C 2C 2C 2C 2C 30 2C 30 30 2C 39 39 2E 39 39 2C 2C 2C 2C 2C 2C 2A 35 36 0D 0A FD B0

程序计算出的,校验值:FD B0,字符串的最后两个byte

将字符串拷入软件中,可以看到:
在这里插入图片描述
该工具的类型有很多,将要验证的字符串拷入后,点击GO,即可生成全部类型的CRC校验值。
可以用该工具的生成值来检验程序的计算是否正确。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-28 07:31:54  更:2021-07-28 07:34:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/29 11:14:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码