CRC校验码生成、int转高低位byte[]

1、一位校验码生成 

  public static byte CRC(byte[] b)
        {
            //一号箱门55 01 a1 5f 00
            string cmdString = null;
            for (int i = 0; i < b.Length; i++)
            {
                cmdString += b[i].ToString("X").PadLeft(2, '0');
            }
            try
            {
                //CRC寄存器
                int CRCCode = 0;
                //将字符串拆分成为16进制字节数据然后两位两位进行异或校验
                for (int i = 1; i < cmdString.Length / 2; i++)
                {
                    string cmdHex = cmdString.Substring(i * 2, 2);
                    if (i == 1)
                    {
                        string cmdPrvHex = cmdString.Substring((i - 1) * 2, 2);
                        CRCCode = (byte)Convert.ToInt32(cmdPrvHex, 16) ^ (byte)Convert.ToInt32(cmdHex, 16);
                    }
                    else
                    {
                        CRCCode = (byte)CRCCode ^ (byte)Convert.ToInt32(cmdHex, 16);
                    }
                }
                return Convert.ToByte(CRCCode);//返回16进制校验码
            }
            catch
            {
                throw;
            }
        }


//int 转 byte[]   低字节在前(低字节序)
public static byte[] IntToByteArray(int n)
{
    byte[] b = new byte[4];
    b[0] = (byte)(n & 0xff);
    b[1] = (byte)(n >> 8 & 0xff);
    b[2] = (byte)(n >> 16 & 0xff);
    b[3] = (byte)(n >> 24 & 0xff);
    return b;
}
//int 转 byte[]   高字节在前(高字节序)
public static byte[] toHH(int n)
{
    byte[] b = new byte[2];
    b[1] = (byte)(n & 0xff);
    b[0] = (byte)(n >> 8 & 0xff);
    return b;
}

2、高低位校验码生成

        /// <summary>
        /// CRC校验,参数data为byte数组
        /// </summary>
        /// <param name="data">校验数据,字节数组</param>
        /// <returns>字节0是高8位,字节1是低8位</returns>
        public static byte[] CRC16(byte[] data)
        {
            //crc计算赋初始值
            int crc = 0xffff;
            for (int i = 0; i < data.Length; i++)
            {
                crc ^= data[i];
                for (int j = 0; j < 8; j++)
                {
                    int temp;
                    temp = crc & 1;
                    crc >>= 1;
                    crc &= 0x7fff;
                    if (temp == 1)
                    {
                        crc ^= 0xa001;
                    }
                    crc &= 0xffff;
                }
            }
            //CRC寄存器的高低位进行互换
            byte[] crc16 = new byte[2];
            //CRC寄存器的高8位变成低8位,
            crc16[1] = (byte)((crc >> 8) & 0xff);
            //CRC寄存器的低8位变成高8位
            crc16[0] = (byte)(crc & 0xff);
            return crc16;
        }
        public static string AddCRC16(byte[] buffer)
        {
            byte[] crc16 = CRC16(buffer);
            byte[] data = new byte[buffer.Length + 2];
            for (int i = 0; i < buffer.Length; i++)
            {
                data[i] = buffer[i];
            }
            data[buffer.Length] = crc16[0];
            data[buffer.Length + 1] = crc16[1];
            //将十进制的data数组转换成16进制的数组
            string str = string.Empty;
            foreach (byte b in data)
            {
                str += $"{b:X2} ";
            }
            return str;
        }

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CRC(Cyclic Redundancy Check)校验是一种常用的数据校验方法,用于检测数据传输过程中是否发生错误。在C#中,可以通过使用运算来实现CRC校验CRC校验通常分为两种方式:高字节优先(Big-Endian)和低字节优先(Little-Endian)。下面分别介绍这两种方式的实现方法: 1. 高字节优先(Big-Endian): 在高字节优先的CRC校验中,先处理高字节,再处理低字节。具体步骤如下: - 定义一个CRC多项式,例如0x1021。 - 初始化一个16寄存器为0xFFFF。 - 对每个字节进行以下操作: - 将寄存器的高8与当前字节进行异或运算。 - 循环8次,每次进行以下操作: - 如果寄存器的最高为1,则将寄存器左移一,并与CRC多项式进行异或运算。 - 否则,将寄存器左移一。 - 最后得到的寄存器值即为CRC校验结果。 2. 低字节优先(Little-Endian): 在低字节优先的CRC校验中,先处理低字节,再处理高字节。具体步骤如下: - 定义一个CRC多项式,例如0x1021。 - 初始化一个16寄存器为0xFFFF。 - 对每个字节进行以下操作: - 将寄存器的低8与当前字节进行异或运算。 - 循环8次,每次进行以下操作: - 如果寄存器的最低为1,则将寄存器右移一,并与CRC多项式进行异或运算。 - 否则,将寄存器右移一。 - 最后得到的寄存器值即为CRC校验结果。 以上是C#中实现CRC校验的基本步骤,具体实现可以根据具体需求进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值