求教 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),验源手写app源码 之后对CRC寄存器从高到低进行移位,验源在最高位(MSB)的验源modelandview源码位置补零,而最低位(LSB,验源移位后已经被移出CRC寄存器)如果为1,验源则把寄存器与预定义的验源多项式码进行异或,否则如果LSB为零,验源则无需进行异或。验源重复上述的验源由高至低的移位8次,第一个8-bit数据处理完毕,验源ethernetmanager 源码用此时CRC寄存器的验源值与下一个8-bit数据异或并进行如前一个数据似的8次移位。所有的验源字符处理完成后CRC寄存器内的值即为最终的CRC值。
CRC校验算法源码(易语言)
CRC校验算法源码在易语言中的chromedriver 源码实现如下:
版本 2
子程序 _CRC校验计算, 参数 预校验内容, 预校验内容为字节型数组
局部变量 crc, 用于存储校验值,初始值为 "2"
局部变量 返回数据, 用于存储最终的校验值,类型为整数型
局部变量 j, 用于数组索引,类型为整数型
局部变量 被校验内容,kakfa 源码 用于存储数组中的每个字节,类型为字节型
局部变量 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低位)
2024-11-23 08:21
2024-11-23 08:15
2024-11-23 07:18
2024-11-23 06:40
2024-11-23 05:59