C#: CRC8,CRC16,CRC32 校验代码

这篇具有很好参考价值的文章主要介绍了C#: CRC8,CRC16,CRC32 校验代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

说明:CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

1. 推荐一个可以在线CRC计算的网站:

http://www.ip33.com/crc.html

C#: CRC8,CRC16,CRC32 校验代码,C#,c#,开发语言

测试数据:AB 01 20 75 D0 85 00 00 00 00 00 01

CRC16 = 4845

CRC32 = ED620F2C

2. CRC 、AES 计算软件

软件还未开发完成,后续完成再上次并附带下载链接,请先关注。

C#: CRC8,CRC16,CRC32 校验代码,C#,c#,开发语言文章来源地址https://www.toymoban.com/news/detail-799951.html

3. CRC 计算代码

public class CrcCheck
{
    public static byte CRC8(byte[] buffer)
    {
        byte crc = 0;
        for (int j = 1; 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;
    }
    /// <summary>
    /// 字节0是高八位,字节1是第八位
    /// </summary>
    /// <param name="buffer"></param>
    /// <returns></returns>
    public static byte[] CRC16(byte[] data)
    {
        int crc = 0xffff;
        for (int i = 0; i < data.Length; i++)
        {
            crc = crc ^ data[i];
            for (int j = 0; j < 8; j++)
            {
                int temp = 0;
                temp = crc & 1;
                crc = crc >> 1;
                crc = crc & 0x7fff;
                if (temp == 1)
                {
                    crc = crc ^ 0xa001;
                }
                crc = crc & 0xffff;
            }
        }
        //CRC寄存器高低位互换
        byte[] crc16 = new byte[2];
        crc16[1] = (byte)((crc >> 8) & 0xff);
        crc16[0] = (byte)(crc & 0xff);
        return crc16;
    }

    public static UInt16 CRC16_U16(byte[] data)
    {
        byte[] crc16 = CRC16(data);
        UInt16 crc16_u16 = 0;
        crc16_u16 = crc16[1];
        crc16_u16 = (ushort)((crc16_u16 << 8) | (UInt16)crc16[0]);
        return crc16_u16;
    }

    public class CRC32
    {
        private static uint[] crcTable;

        private const uint polynomial = 0xEDB88320;

        public static uint Calculate(byte[] bytes)
        {
            if (crcTable == null)
            {
                InitializeCrcTable();
            }

            uint crc = 0xFFFFFFFF;

            for (int i = 0; i < bytes.Length; i++)
            {
                byte index = (byte)(((crc) & 0xFF) ^ bytes[i]);
                crc = (crc >> 8) ^ crcTable[index];
            }

            return ~crc;
        }

        public static byte[] Calculate_byte(byte[] bytes)
        {
            uint crc32_u =  Calculate(bytes);
            byte[] crc_byte = BitConverter.GetBytes(crc32_u);
            return crc_byte;
        }

        private static void InitializeCrcTable()
        {
            crcTable = new uint[256];

            for (uint i = 0; i < 256; i++)
            {
                uint crc = i;

                for (int j = 0; j < 8; j++)
                {
                    crc = (crc & 1) != 0 ? (crc >> 1) ^ polynomial : crc >> 1;
                }

                crcTable[i] = crc;
            }
        }
    }

}

到了这里,关于C#: CRC8,CRC16,CRC32 校验代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言CRC-16 CCITT-FALSE格式校验函数

    CRC-16校验产生2个字节长度的数据校验码,通过计算得到的校验码和获得的校验码比较,用于验证获得的数据的正确性。基本的CRC-16校验算法实现,参考: C语言标准CRC-16校验函数。 不同应用规范通过对输入数据前处理和输出数据后处理的方式不同,又产生了不同的应用规范校

    2024年02月12日
    浏览(47)
  • CRC8检验算法(C语言实现)

    初始值:0xFF 多项式 :X^8+X^2+X^1+1,即0x31 结果异或值:0x00 直接计算法: 查表法:

    2024年02月20日
    浏览(37)
  • C语言CRC-32 STM32格式校验函数

    CRC-32校验产生4个字节长度的数据校验码,通过计算得到的校验码和获得的校验码比较,用于验证获得的数据的正确性。基本的CRC-32校验算法实现,参考: C语言标准CRC-32校验函数 不同厂家通过对输入数据前处理和输出数据后处理的方式不同,又产生了不同的厂家校验函数,这

    2023年04月27日
    浏览(54)
  • CRC校验(2):CRC32查表法详解、代码实现及CRC反转

    对于现在的CPU来说,基本上都在硬件上实现了CRC校验。但我们还是想用软件来实现一下CRC的代码,这样可以更深入地理解里面的原理。所以这一节就来详细地解释如何使用查表法从软件上来实现CRC-32的校验。另外,CRC还有一种反转的情况,实际上反转和不反转没有什么太大的

    2024年02月09日
    浏览(219)
  • C# | 上位机开发新手指南(五)校验算法——CRC

    当我们在进行数据传输时,可能会因为信道噪声、干扰等因素导致数据出现错误,从而影响传输的可靠性和准确性。此时,我们需要一种方法来检测数据是否出现错误,并尽可能快速地发现和纠正错误。CRC(Cyclic Redundancy Check)校验算法就是一种常用的数据校验方法,它通过

    2024年01月18日
    浏览(55)
  • CRC校验码生成逻辑的实现原理详解——结合C语言和Verilog语言代码分析

    因为前段时间用到CRC校验码,所以在网上找到了很多有关CRC校验码计算原理以及生成CRC校验码的代码实现(包括C语言和Verilog语言的实现)的文章,但关于CRC校验码代码实现的原理未能找到相关文章,于是自己结合C语言和Veirlog语言的实现代码以及CRC校验码的计算原理,对CR

    2023年04月22日
    浏览(99)
  • 16位CRC校验码计算,485MODBUS计算

    CRC计算方法是: 1、 加载一值为0XFFFF的16位寄存器,此寄存器为CRC寄存器。 2、 把第一个8位二进制数据(即通讯信息帧的第一个字节)与16位的CRC寄存器的相异或,异或的结果仍存放于该CRC寄存器中。 3、 把CRC寄存器的内容右移一位,用0填补最高位,并检测移出位是0还是1。

    2024年02月11日
    浏览(39)
  • MODBUS RTU 通信协议 CRC16校验算法

    CRC校验码是一个2个字节(16位二进制)的数。 发送端:发送的数据计算CRC校验码----发送:数据+CRC校验码 接收端:收到数据后重新计算CRC校验码,然后和接收到数据中的CRC校验码进行比较,判断是否相等。 如果不相等:数据传输过程中出错,给出错误应答。 CRC16 校验源码

    2024年02月16日
    浏览(49)
  • MODBUS模型下CRC-16校验C/C++程序实现

    看了很多相关博客,例如http://t.csdn.cn/Ek3RV 又例如http://t.csdn.cn/HGUmo 这些文章所提供的代码似乎都是没有错误的,但很多文章的文字描述和代码并不对应。因此我也整理了一下,也当做是给自己做个笔记。 CRC校验按位计算的程序很好理解,写起来也比较简单,就是把模二除法

    2024年02月16日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包