C# CRC8

简介: C# CRC8

C# CRC8

C#
///
/// This enum is used to indicate what kind of checksum you will be calculating.
///
public enum CRC8_POLY
{
    CRC8 = 0xd5,
    CRC8_CCITT = 0x07,
    CRC8_DALLAS_MAXIM = 0x31,
    CRC8_SAE_J1850 = 0x1D,
    CRC_8_WCDMA = 0x9b,
};
///
/// Class for calculating CRC8 checksums...
///
public class CRC8Calc {
    private byte[] table = new byte[256];
    
    public byte Checksum(params byte[] val ) 
    {
        if(val == null) 
            throw new ArgumentNullException("val");
            
        byte c = 0;
        foreach ( byte b in val ) 
        {
            c = table[c ^ b];
        }
    
        return c;
    } 
    public byte[] Table
    {
        get
        {
            return this.table;
        }
        set
        {
            this.table = value;
        }
    }
    
    public byte[] GenerateTable(CRC8_POLY polynomial)
    {
        byte[] csTable = new byte[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);
    }
}
Example
C#
using System;
public class CRC8Test
{
    public static void RunSnippet()
    {
        byte checksum;
        byte[] testVal = new byte[]
        {0xee, 0x01, 0x13, 0x00, 0x06, 0x1c, 0x00, 0x20,  0x1d, 0x00, 0x00};
        CRC8Calc crc_dallas = new CRC8Calc(CRC8_POLY.CRC8_DALLAS_MAXIM);
        checksum = crc_dallas.Checksum(testVal);
        WL(checksum);
        CRC8Calc crc = new CRC8Calc(CRC8_POLY.CRC8_CCITT);
        checksum = crc.Checksum(testVal);
        WL(checksum);
    }
    
    #region Helper methods
    
    public static void Main()
    {
        try
        {
            RunSnippet();
        }
        catch (Exception e)
        {
            string error = string.Format
            ("---\nThe following error occurred while executing 
                the snippet:\n{0}\n---", e.ToString());
            Console.WriteLine(error);
        }
        finally
        {
            Console.Write("Press any key to continue...");
            Console.ReadKey();
        }
    }
    private static void WL(object text, params object[] args)
    {
        Console.WriteLine(text.ToString(), args);   
    }
    
    #endregion
}

 

目录
相关文章
|
6月前
|
C++
C/C++给文件加crc校验
C/C++给文件加crc校验
109 1
|
6月前
|
算法 Java 索引
Byte Hex CRC计算笔记
Byte Hex CRC计算笔记
75 0
|
6月前
CRC与FCS的区别和联系
CRC与FCS的区别和联系
278 0
|
算法
模二运算、循环冗余检验(CRC)
模二运算、循环冗余检验(CRC)
211 0
|
存储 编解码 算法
CRC校验原来这么简单
CRC校验原来这么简单
974 0
CRC校验原来这么简单
|
算法
CRC 校验算法
CRC 校验算法
260 0
CRC校验
CRC--循环冗余校验
CRC校验
|
存储 算法 安全
MD5、SHA1、CRC32值是干什么的?
Hash,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。 简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。HASH主要用于信息安全领域中加密算法,他把一些不同长度的信息转化成杂乱的128位的编码里,叫做HASH值。也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系。 MD5和SHA1可以说是目前应用最广泛的Hash算法,而它们都是以MD4为基础设计的。
334 0
|
存储 PHP