【手机网站模板 源码】【金色荣耀源码】【elmentui源码详解】crc16校验源码

时间:2024-12-29 17:11:28 来源:c语言 串口 源码 分类:综合

1.求教 C#语言编写 的验源CRC16的校验程序 (多项式为:CRC-16/X25 x16+x12+x5+1)
2.crc16的校验码的算法
3.CRC16校验算法源码(易语言)

crc16校验源码

求教 C#语言编写 的CRC16的校验程序 (多项式为:CRC-16/X25 x16+x12+x5+1)

       using System;

       using System.Collections.Generic;

       using System.Linq;

       using System.Text;

       namespace ConvertToCRC

       {

        public static class CRCUtil

        {

        // CRC高位字节表

        private static readonly byte[] m_CRCHighOrderByteTable = new byte[]

        {

        0x, 0xC1, 0x, 0x, 0x, 0xC0, 0x, 0x, 0x, 0xC0,

        0x, 0x, 0x, 0xC1, 0x, 0x, 0x, 0xC0, 0x, 0x,

        0x, 0xC1, 0x, 0x, 0x, 0xC1, 0x, 0x, 0x, 0xC0,

        0x, 0x, 0x, 0xC0, 0x, 0x, 0x, 0xC1, 0x, 0x,

        0x, 0xC1, 0x, 0x, 0x, 0xC0, 0x, 0x, 0x, 0xC1,

        0x, 0x, 0x, 0xC0, 0x, 0x, 0x, 0xC0, 0x, 0x,

        0x, 0xC1, 0x, 0x, 0x, 0xC0, 0x, 0x, 0x, 0xC1,

        0x, 0x, 0x, 0xC1, 0x, 0x, 0x, 0xC0, 0x, 0x,

        0x, 0xC1, 0x, 0x, 0x, 0xC0, 0x, 0x, 0x, 0xC0,

        0x, 0x, 0x, 0xC1, 0x, 0x, 0x, 0xC1, 0x, 0x,

        0x, 0xC0, 0x, 0x, 0x, 0xC0, 0x, 0x, 0x, 0xC1,

        0x, 0x, 0x, 0xC0, 0x, 0x, 0x, 0xC1, 0x, 0x,

        0x, 0xC1, 0x, 0x, 0x, 0xC0, 0x, 0x, 0x, 0xC0,

        0x, 0x, 0x, 0xC1, 0x, 0x, 0x, 0xC1, 0x, 0x,

        0x, 0xC0, 0x, 0x, 0x, 0xC1, 0x, 0x, 0x, 0xC0,

        0x, 0x, 0x, 0xC0, 0x, 0x, 0x, 0xC1, 0x, 0x,

        0x, 0xC1, 0x, 0x, 0x, 0xC0, 0x, 0x, 0x, 0xC0,

        0x, 0x, 0x, 0xC1, 0x, 0x, 0x, 0xC0, 0x, 0x,

        0x, 0xC1, 0x, 0x, 0x, 0xC1, 0x, 0x, 0x, 0xC0,

        0x, 0x, 0x, 0xC1, 0x, 0x, 0x, 0xC0, 0x, 0x,

        0x, 0xC0, 0x, 0x, 0x, 0xC1, 0x, 0x, 0x, 0xC0,

        0x, 0x, 0x, 0xC1, 0x, 0x, 0x, 0xC1, 0x, 0x,

        0x, 0xC0, 0x, 0x, 0x, 0xC0, 0x, 0x, 0x, 0xC1,

        0x, 0x, 0x, 0xC1, 0x, 0x, 0x, 0xC0, 0x, 0x,

        0x, 0xC1, 0x, 0x, 0x, 0xC0, 0x, 0x, 0x, 0xC0,

        0x, 0x, 0x, 0xC1, 0x, 0x

        };

        // CRC低位字节表

        private static readonly byte[] m_CRCLowOrderByteTable = new byte[]

        {

        0x, 0xC0, 0xC1, 0x, 0xC3, 0x, 0x, 0xC2, 0xC6, 0x,

        0x, 0xC7, 0x, 0xC5, 0xC4, 0x, 0xCC, 0x0C, 0x0D, 0xCD,

        0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x,

        0x, 0xC8, 0xD8, 0x, 0x, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,

        0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x, 0xD4,

        0xD5, 0x, 0xD7, 0x, 0x, 0xD6, 0xD2, 0x, 0x, 0xD3,

        0x, 0xD1, 0xD0, 0x, 0xF0, 0x, 0x, 0xF1, 0x, 0xF3,

        0xF2, 0x, 0x, 0xF6, 0xF7, 0x, 0xF5, 0x, 0x, 0xF4,

        0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,

        0x3B, 0xFB, 0x, 0xF9, 0xF8, 0x, 0x, 0xE8, 0xE9, 0x,

        0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,

        0xEC, 0x2C, 0xE4, 0x, 0x, 0xE5, 0x, 0xE7, 0xE6, 0x,

        0x, 0xE2, 0xE3, 0x, 0xE1, 0x, 0x, 0xE0, 0xA0, 0x,

        0x, 0xA1, 0x, 0xA3, 0xA2, 0x, 0x, 0xA6, 0xA7, 0x,

        0xA5, 0x, 0x, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,

        0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x, 0xA9, 0xA8, 0x,

        0x, 0xB8, 0xB9, 0x, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,

        0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x, 0x, 0xB5,

        0x, 0xB7, 0xB6, 0x, 0x, 0xB2, 0xB3, 0x, 0xB1, 0x,

        0x, 0xB0, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x,

        0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x9C, 0x5C,

        0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,

        0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x4B, 0x8B,

        0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,

        0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x, 0x,

        0x, 0x, 0x, 0x, 0x, 0x

        };

        /// <summary>

        /// 获得CRC效验码

        /// </summary>

        /// <param name="buffer"></param>

        /// <returns></returns>

        public static void CalculateCrc(byte[] buffer, out byte crcHighOrderByte, out byte crcLowOrderByte)

        {

        // CRC高位字节/低位字节

        crcHighOrderByte = crcLowOrderByte = 0xff;

        for (int i = 0; i < buffer.Length; i++)

        {

        // 计算CRC查找索引

        int crcIndex = crcHighOrderByte ^ buffer[i];

        crcHighOrderByte = (byte)(crcLowOrderByte ^ m_CRCHighOrderByteTable[crcIndex]);

        crcLowOrderByte = (byte)m_CRCLowOrderByteTable[crcIndex];

        }

        }

        }

       }

       // 工具函数如上

crc的校验码的算法

       方法如下:

       CRC-码由两个字节构成,在开始时CRC寄存器的验源每一位都预置为1,然后把CRC寄存器与8-bit的验源数据进行异或(异或:二进制运算 相同为0,不同为1;0^0=0;0^1=1;1^0=1;1^1=0),验源手机网站模板 源码 之后对CRC寄存器从高到低进行移位,验源在最高位(MSB)的验源金色荣耀源码位置补零,而最低位(LSB,验源移位后已经被移出CRC寄存器)如果为1,验源则把寄存器与预定义的验源多项式码进行异或,否则如果LSB为零,验源则无需进行异或。验源重复上述的验源由高至低的移位8次,第一个8-bit数据处理完毕,验源elmentui源码详解用此时CRC寄存器的验源值与下一个8-bit数据异或并进行如前一个数据似的8次移位。所有的验源字符处理完成后CRC寄存器内的值即为最终的CRC值。

CRC校验算法源码(易语言)

       CRC校验算法源码在易语言中的mha主库源码实现如下:

       版本 2

       子程序 _CRC校验计算, 参数 预校验内容, 预校验内容为字节型数组

       局部变量 crc, 用于存储校验值,初始值为 "2"

       局部变量 返回数据, 用于存储最终的校验值,类型为整数型

       局部变量 j, 用于数组索引,类型为整数型

       局部变量 被校验内容,直播声卡源码 用于存储数组中的每个字节,类型为字节型

       局部变量 i, 用于循环计数,类型为整数型

       局部变量 CY, 用于判断当前位是否为1,类型为整数型

       局部变量 crc高位, 用于存储高位校验值,类型为文本型

       局部变量 crc低位, 用于存储低位校验值,类型为文本型

       初始化crc为 { , }

       计次循环首 (取数组成员数 (预校验内容), j)

       被校验内容 = 预校验内容 [j]

       crc [2] = 位异或 (被校验内容, crc [2])

       计次循环首 (8, i)

       CY = 位与 (crc [2], 1) ' 检查CRC[2]与1有没有共同位

       如果 (CY = 1) ' 如果CRC[2]与1有共同位

       crc [2] = 右移 (crc [2], 1) ' 低位右移一位

       如果真 (位与 (crc [1], 1) = 1) ' 如果校验高位与1有共同位

       crc [2] = 位或 (crc [2], ) ' 给crc低位最高位补1

       如果真结束

       crc [1] = 右移 (crc [1], 1) ' crc高位右移一位

       crc [2] = 位异或 (crc [2], 1) ' CRC低位与生成多项式0XA求异或

       crc [1] = 位异或 (crc [1], ) ' CRC高位与生成多项式0XA求异或

       否则

       crc [2] = 右移 (crc [2], 1) ' 低为右移一位

       如果真 (位与 (crc [1], 1) = 1) ' 如果校验高位与1有共同位

       crc [2] = 位或 (crc [2], ) ' 给crc低位最高位补1

       如果真结束

       crc [1] = 右移 (crc [1], 1) ' 高位右移1位

       否则结束

       计次循环尾 ()

       计次循环尾 ()

       如果真 (取文本长度 (到文本 (crc [1])) = 1)

       crc高位 = “” + 到文本 (crc [1])

       如果真结束

       如果真 (取文本长度 (到文本 (crc [1])) = 2)

       crc高位 = “0” + 到文本 (crc [1])

       如果真结束

       如果真 (取文本长度 (到文本 (crc [1])) = 3)

       crc高位 = 到文本 (crc [1])

       如果真结束

       如果真 (取文本长度 (到文本 (crc [2])) = 1)

       crc低位 = “” + 到文本 (crc [2])

       如果真结束

       如果真 (取文本长度 (到文本 (crc [2])) = 2)

       crc低位 = “0” + 到文本 (crc [2])

       如果真结束

       如果真 (取文本长度 (到文本 (crc [2])) = 3)

       crc低位 = 到文本 (crc [2])

       如果真结束

       返回 (crc高位 + crc低位)