首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C#校验和CRC16 CCITT

在 C# 中计算 CRC16-CCITT 校验和可以通过实现 CRC 算法来完成。CRC16-CCITT 是一种常见的循环冗余校验算法,广泛用于数据校验和错误检测。以下是一个示例代码,展示了如何在 C# 中计算 CRC16-CCITT 校验和。

CRC16-CCITT 算法

CRC16-CCITT 的多项式通常为 0x1021,初始值为 0xFFFF。以下是一个实现 CRC16-CCITT 的 C# 示例代码:

代码语言:javascript
复制
using System;

public class CRC16CCITT
{
    private const ushort polynomial = 0x1021;
    private ushort[] table = new ushort[256];
    private ushort initialValue = 0xFFFF;

    public CRC16CCITT()
    {
        GenerateTable();
    }

    private void GenerateTable()
    {
        for (ushort i = 0; i < table.Length; ++i)
        {
            ushort value = 0;
            ushort temp = (ushort)(i << 8);
            for (byte j = 0; j < 8; ++j)
            {
                if (((value ^ temp) & 0x8000) != 0)
                {
                    value = (ushort)((value << 1) ^ polynomial);
                }
                else
                {
                    value <<= 1;
                }
                temp <<= 1;
            }
            table[i] = value;
        }
    }

    public ushort ComputeChecksum(byte[] bytes)
    {
        ushort crc = initialValue;
        foreach (byte b in bytes)
        {
            byte index = (byte)((crc >> 8) ^ b);
            crc = (ushort)((crc << 8) ^ table[index]);
        }
        return crc;
    }

    public byte[] ComputeChecksumBytes(byte[] bytes)
    {
        ushort crc = ComputeChecksum(bytes);
        return BitConverter.GetBytes(crc);
    }
}

class Program
{
    static void Main()
    {
        CRC16CCITT crc16 = new CRC16CCITT();
        byte[] data = System.Text.Encoding.ASCII.GetBytes("123456789");
        ushort checksum = crc16.ComputeChecksum(data);
        Console.WriteLine("CRC16-CCITT Checksum: 0x" + checksum.ToString("X4"));
    }
}

代码解释

  1. CRC16CCITT 类
    • polynomial:CRC16-CCITT 的多项式 0x1021
    • table:用于存储预计算的 CRC 表。
    • initialValue:CRC 计算的初始值 0xFFFF
  2. GenerateTable 方法
    • 生成 CRC 表,用于快速计算 CRC 值。
  3. ComputeChecksum 方法
    • 计算给定字节数组的 CRC16-CCITT 校验和。
  4. ComputeChecksumBytes 方法
    • 返回 CRC 校验和的字节数组表示。
  5. Main 方法
    • 创建 CRC16CCITT 实例。
    • 计算字符串 "123456789" 的 CRC16-CCITT 校验和,并输出结果。

使用示例

Main 方法中,我们计算字符串 "123456789" 的 CRC16-CCITT 校验和,并输出结果。你可以根据需要修改输入数据来计算其他数据的 CRC 校验和。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

CRC校验算法详解「建议收藏」

从上面介绍的原理我们可以大致知道CRC校验的准确率,在CRC8中出现了误码但没发现的概率是1/256,CRC16的概率是1/65536,而CRC32的概率则是1/2^32,那已经是非常小了,所以一般在数据不多的情况下用...CRC16校验就可以了,而在整个文件的校验中一般用CRC32校验。   ...好了,现在被除数除数都有了,那么就要开始做除法求CRC校验码了。...不过普通减法有差别的是,CRC的加(减)法是不进(借)位的,比如10减01,它的结果是11,而不是借位减法得到的01,因此,实际上CRC的加法减法所得的结果是一样的,比如10加01的结果是11,10...]; return crc; }   最后要说的是CRC的正序反转问题,比如前面ccitt-crc16的正序是0x1021,如果是反转就是0x8408(就是将0x1021倒过来低位变高位

2.4K31

CRC校验算法入门

CRC(Cyclic Redundancy Check),即循环冗余校验码,是通信领域中一种常用的数据校验码,通过一定算法,将计算结果附在数据后面一起进行传输,对传输的数据具有检错功能。...01 几个基本概念 (1)生成多项式 是接收方发送方的一个约定,是一个二进制数,在整个数据传输过程中这个数保持不变,记为Ploy。...常用的生成多项式: CRC8 = x^8 + x^5 + x^4 + x^0 CRC-CCITT = x^16 + x^12 + x^5 + x^0 CRC16 = x^16 + x^15 + x^2...下面就(2)中除数被除数做一次模2除法运算进行说明。 (4)多项式位宽 多项式位宽记为W,长度为:生成多项式位数 – 1,按照CRC算法的要求,计算前要在原始数据后面填上W个0。...计算出的CRC校验码附在原数据帧后面,接收端以模2除法除以多项式,没有余数,则数据无误。

4.6K20

python 计算校验

校验是经常使用的,这里简单的列了一个针对按字节计算累加的代码片段。其实,这种累加的计算,将字节翻译为无符号整数带符号整数,结果是一样的。 使用python计算校验时记住做截断就可以了。...这里仅仅是作为一个代码样本,权作标记,直接上代码 ''' Created on 2014年9月4日 @author: lenovo ''' import random ''' 实际计算校验时,解释为无符号整数还是带符号整数...如果是带符号整数,最高位会被解释符号位 ''' def char_checksum(data, byteorder='little'): ''' char_checksum 按字节计算校验...return checksum def uchar_checksum(data, byteorder='little'): ''' char_checksum 按字节计算校验...所以一般情况下可以使用无符号整数来计算校验,简单快速。

2.7K10

校验计算原理_CRC校验原理及代码

应该按如下步骤: 1、把校验字段设置为0; 2、把需要校验的数据看成以16位为单位的数字组成,依次进行二进制反码求和; 3、把得到的结果存入校验字段中 在接收数据时,计算数据包的检验相对简单...,按如下步骤: 1、把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验字段; 2、检查计算出的校验的结果是否为0; 3、如果等于0,说明被整除,校验正确。...虽然说上面四种报文的校验算法一样,但是在作用范围存在不同:IP校验校验20字节的IP报头;而ICMP校验覆盖整个报文(ICMP报头+ICMP数据);UDPTCP校验不仅覆盖整个报文,而且还有...另外UDP、TCP数据报的长度可以为奇数字节,所以在计算校验时需要在最后增加填充字节0(填充字节只是为了计算校验,可以不被传送)。...计算验证校验比较简单、快递。

2K30

校验(Checksum)「建议收藏」

校验(Checksum) PE的可选映像头(IMAGE_OPTION_HEADER)里面,有一个Checksum字段,是该文件的校验,一般EXE文件可以使0,但一些重要的系统DLL及驱动文件必须有一个校验...指向PE文件头的CheckSum LPDWORD new_checksum // 指向新计算出的Checksum } 程序一旦运行后,new_checksum 地址处将放当前的文件的校验...内存映像校验 磁盘文件完整性校验可以抵抗解密者直接修改文件,但对内存补丁却没有效果,必须对内存关键的代码进行校验. 1 对整个代码进行校验 每个程序至少有一个代码区块和数据区块,数据区块属性可读写,程序运行时全局变量通常会放在这里...,这些数据会动态变化,因此校验这部分是没什么意义,而代码段只读,存放的是程序代码,在程序中数据数不会变的,因此用这部分进行内存校验是可行的....具体实现方法: (1) 从内存中映像中得到PE相关数据,如代码块的RVA内存大小 (2) 根据得到代码区块的RVA值内存大小,计算出内存数据的CRC-32值 (3) 读取自身文件先前存储的CRC-32

1.5K10

SpringMVC参数校验,包括JavaBean基本类型的校验

该示例项目使用SpringBoot,添加webaop依赖。 SpringMVC最常用的校验是对一个javaBean的校验,默认使用hibernate-validator校验框架。.../blog/2312356 校验基本类型 在很多场景下,我们不需要校验一个javaBean,更多的是校验单个的int,String等。...也就是controller里的secondthird方法。像方法中写的那样,但是直接写上去,是不起作用的,校验框架并没有去校验,我们需要做的就是让它生效。...第65行到85行是对普通参数进行校验的。...加上这几行代码后在controller里写的那些才会生效,并且把校验信息保存到了ConstraintViolation的Set集合里,判断Set是否有值,即可知道是否有校验不通过的信息,然后就可以取到校验信息并返回给用户

1.6K30

UDP协议:校验的计算

在讲UDP的校验计算之前,先需要明确一件事情:在计算UDP报文的Checksum之前,我们需要在UDP报文段的头部之前,加入一个“伪头部”。...原因是,UDP协议只使用它来辅助计算校验,它并不是发送IP数据包时使用的IP数据包的头部。 校验的计算 在《计算机网络:自顶向下方法》这本书的中译版本中,对于UDP校验的计算讲解不算很清楚。...最终,将低16位取反,得到校验,填入checksum字段中 差错检验 当接收到UDP报文时,需要如何检验其正确性?...方法就是将UDP报文中包括校验和在内的,所有的16位的数相加,如果低16位全为1,则没有出错。否则表明该分组中出现了错误。 需要注意,UDP对差错具有一定的校验能力,但缺少差错恢复的能力。

2.9K40
领券