C# CRC8校验

1. 查表法:
复制代码
public class CRC8
{
    /// <summary> 
    
/// CRC8位校验表 
    
/// </summary> 
    private byte[] CRC8Table = new byte[] { 
        0,94,188,226,97,63,221,131,194,156,126,32,163,253,31,65
        157,195,33,127,252,162,64,3095,1,227,189,62,96,130,220,
        35,125,159,193,66,28,254,160,225,191,93,3,128,222,60,98,
        190,224,2,92,223,129,99,61,124,34,192,158,29,67,161,255,
        70,24,250,164,39,121,155,197,132,218,56,102,229,187,89,7,
        219,133,103,57,186,228,6,88,25,71,165,251,120,38,196,154,
        101,59,217,135,4,90,184,230,167,249,27,69,198,152,122,36,
        248,166,68,26,153,199,37,123,58,100,134,216,91,5,231,185,
        140,210,48,110,237,179,81,15,78,16,242,172,47,113,147,205,
        17,79,173,243,112,46,204,146,211,141,111,49,178,236,14,80,
        175,241,19,77,206,144,114,44,109,51,209,143,12,82,176,238,
        50,108,142,208,83,13,239,177,240,174,76,18,145,207,45,115,
        202,148,118,40,171,245,23,73,8,86,180,234,105,55,213,139,
        87,9,235,181,54,104,138,212,149,20341,119,244,170,72,22,
        233,183,85,11,136,214,52,106,43,117,151,201,74,20,246,168,
        116,42,200,150,21,75,169,247,182,232,10,84,215,137,107,53 };

    public byte CRC(byte[] buffer)
    {
        return CRC(buffer, 0, buffer.Length);
    }

    public byte CRC(byte[] buffer, int off, int len)
    {
        byte crc = 0;
        if (buffer == null)
        {
            throw new ArgumentNullException("buffer");
        }
        if (off < 0 || len < 0 || off + len > buffer.Length)
        {
            throw new ArgumentOutOfRangeException();
        }

        for (int i = off; i < len; i++)
        {
            crc = CRC8Table[crc ^ buffer[i]];
        }
        return crc;
    }
}
复制代码

 

2. 计算法1:

复制代码
public static byte CRC8(byte[] buffer)
{
    byte crc = 0;
    for (int j = 0; j < buffer.Length; j++)
    {
        crc ^= buffer[j];
        for (int i = 0; i < 8; i++)
        {
            if ((crc & 0x01) != 0)
            {
                crc >>= 1;
                crc ^= 0x8c;
            }
            else
            {
                crc >>= 1;
            }
        }
    }
    return crc;
}
复制代码

 

3. 计算法2:

复制代码
public byte CRC8(byte[] buffer)    
{   
    byte crc=0;
    for (int j=0;j<buffer.Length;j++)
    {
        for (int i = 1; i != 0; i *= 2)
        {
            if ((crc & 1) != 0)
            {
                crc /= 2;
                crc ^= 0x8C;
            }
            else
            {
                crc /= 2;
            }
            if ((buffer[j] & i) != 0) crc ^= 0x8C;  
        }      
    }
    return crc;
}
复制代码
注:查表法和计算法1的CRC的结果相同。

posted on   大豆男生  阅读(8818)  评论(2编辑  收藏  举报

编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
历史上的今天:
2009-10-19 C# 扩展 string Split 方法

导航

< 2011年10月 >
25 26 27 28 29 30 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示