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;
            }
        }

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

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

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

  • 相关阅读:
    vhdl 语法总结 4
    模拟地数字地连接以及0欧电阻作用
    vhdl 语法总结5
    电容参数X5R,X7R,Y5V等代表什么意思呢?(转)
    传智播客视频资料
    out.println 和<%=%>两种不同输出的形式
    易忘记的java名词
    JavaScript和JSP运用上的区别
    多线程 Time和TimeTask组合
    马路上的井盖为什么是圆的?(微软面试题)
  • 原文地址:https://www.cnblogs.com/subendong/p/11908205.html
Copyright © 2011-2022 走看看