CRC-8校验算法

publicenum CRC8_POLY
{
CRC8 =0xd5,
CRC8_CCIIT =0x07,
CRC8_DALLAS_MAXIM =0x31,
CRC8_SAE_J1850 =0x1d,
CRC_8_WCDMA =0x9b,
};
publicclass CRC8Calc
{
privatebyte[] table =newbyte[256];
publicbyte Checksum(paramsbyte[] val)
{
if (val ==null)
thrownew ArgumentNullException("Val");
byte c =0;
foreach (byte b in val)
c = table[c ^ b];
return c;
}
publicbyte[] Table
{
get
{
returnthis.table;
}
set
{
table = value;
}
}
publicbyte[] GenerateTable(CRC8_POLY polynomial)
{
byte[] csTable =newbyte[256];
for (int i =0; i <256; ++i)
{
int curr = i;
for (int j =0; j <8; ++j)
{
if ((curr &0x80) !=0)
curr = (curr <<1) ^ (int)polynomial;
else
curr <<=1;
}
csTable[i] = (byte)curr;
}
return csTable;
}
public CRC8Calc(CRC8_POLY polynomial)
{
this.table =this.GenerateTable(polynomial);
}
}
class Program
{
staticvoid Main(string[] args)
{
RunSnippet();
}
publicstaticvoid RunSnippet()
{
byte checksum;
byte[] testVal =newbyte[] { 0x01};
CRC8Calc crc =new CRC8Calc(CRC8_POLY.CRC8_DALLAS_MAXIM);
checksum = crc.Checksum(testVal);
WL(checksum);
Console.ReadKey();
}
publicstaticvoid WL(object text, paramsobject[] args)
{
Console.WriteLine(text.ToString(), args);
}
}
staticbyte CheckValue(byte[] b, int len)
{
byte crc =0;
byte j =0;
while (len --!=0)
{
for (byte i =0x80; i !=0; i >>=1)
{
if ((crc & MSB_MASK_8) !=0) // 1 0 0 0 0 0 0 0 判断crc中得最高位是否为1
{ // 如果crc中得最高位为1,就执行以下语句,与R_8做XOR运算
crc <<=1; //
crc &= LIMIT_MASK_8; // 1 1 1 1 1 1 1 1
crc ^= R_8;
}
else
crc <<=1;
if ((b[j] & i) !=0) // 每循环一次,从数据的最高位依次取到最低位,如果取得的数据位为1,就执行以下语句
crc ^= R_8; // 1 0 0 1 1 0 1 1
}
j++;
}
return crc;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?