zoukankan      html  css  js  c++  java
  • c# CRC16位校验辅助类

        public class CRC16Helper
        {
            /// <summary>
            /// CRC校验
            /// </summary>
            /// <param name="data">校验数据</param>
            /// <returns>高低8位</returns>
            public static string CRCCalc(string data)
            {
                string[] datas = data.Split(' ');
                List<byte> bytedata = new List<byte>();
    
                foreach (string str in datas)
                {
                    bytedata.Add(byte.Parse(str, System.Globalization.NumberStyles.AllowHexSpecifier));
                }
                byte[] crcbuf = bytedata.ToArray();
                //计算并填写CRC校验码
                int crc = 0xffff;
                int len = crcbuf.Length;
                for (int n = 0; n < len; n++)
                {
                    byte i;
                    crc = crc ^ crcbuf[n];
                    for (i = 0; i < 8; i++)
                    {
                        int TT;
                        TT = crc & 1;
                        crc = crc >> 1;
                        crc = crc & 0x7fff;
                        if (TT == 1)
                        {
                            crc = crc ^ 0xa001;
                        }
                        crc = crc & 0xffff;
                    }
    
                }
                string[] redata = new string[2];
                redata[1] = Convert.ToString((byte)((crc >> 8) & 0xff), 16);
                redata[0] = Convert.ToString((byte)((crc & 0xff)), 16);
                return data + " " + redata[0] + " " + redata[1];
            }
    
            /// <summary>
            /// CRC校验
            /// </summary>
            /// <param name="bytes"></param>
            /// <returns></returns>
            public static byte[] CRC16(byte[] bytes)
            {
                //计算并填写CRC校验码
                int crc = 0xffff;
                int len = bytes.Length;
                for (int n = 0; n < len; n++)
                {
                    byte i;
                    crc = crc ^ bytes[n];
                    for (i = 0; i < 8; i++)
                    {
                        int TT;
                        TT = crc & 1;
                        crc = crc >> 1;
                        crc = crc & 0x7fff;
                        if (TT == 1)
                        {
                            crc = crc ^ 0xa001;
                        }
                        crc = crc & 0xffff;
                    }
    
                }
    
                var nl = bytes.Length + 2;
                //生成的两位校验码
                byte[] redata = new byte[2];
                redata[0] = (byte)((crc & 0xff));
                redata[1] = (byte)((crc >> 8) & 0xff);
    
                //重新组织字节数组
                var newByte = new byte[nl];
                for (int i = 0; i < bytes.Length; i++)
                {
                    newByte[i] = bytes[i];
                }
                newByte[nl - 2] = (byte)redata[0];
                newByte[nl -1] = redata[1];
    
                return newByte;
            }
        }

    第一个方法是把校验位返回,返回的是字符串

    第二个是在第一个的基础上改的,返回的是加了校验位之后的数据,字节数组。

    说明:代码来自好互联网。

  • 相关阅读:
    06-python基础-基本数据类型介绍
    05 python开发的IDE之一--pycharm以及基本的运算符
    04 python基础-变量及如果语句的作业
    03 python基础-变量
    02 python的安装及分类
    es6的标签整体引用及引入变量
    django之auth组件【知识点补充】
    BootStrap让两个控件在一行显示(label和input同行)
    django 将view视图中的对象传入forms表单验证模块中
    Django ajax异步请求分页的实现
  • 原文地址:https://www.cnblogs.com/subendong/p/11908205.html
Copyright © 2011-2022 走看看