TCP/IP通信或串口通信数据校验

        /// <summary>
        /// RLC校验
        /// </summary>
        /// <param name="writeUncheck"></param>
        /// <returns></returns>
        public static string CheckSum(string writeUncheck)
        {
            char[] hexArray = new char[writeUncheck.Length];
            hexArray = writeUncheck.ToCharArray();
            int decNum = 0, decNumMSB = 0, decNumLSB = 0;
            int decByte, decByteTotal = 0;

            bool msb = true;

            for (int t = 0; t <= hexArray.GetUpperBound(0); t++)
            {
                if ((hexArray[t] >= 48) && (hexArray[t] <= 57))

                    decNum = (hexArray[t] - 48);

                else if ((hexArray[t] >= 65) & (hexArray[t] <= 70))
                    decNum = 10 + (hexArray[t] - 65);

                if (msb)
                {
                    decNumMSB = decNum * 16;
                    msb = false;
                }
                else
                {
                    decNumLSB = decNum;
                    msb = true;
                }
                if (msb)
                {
                    decByte = decNumMSB + decNumLSB;
                    decByteTotal += decByte;
                }
            }

            decByteTotal = (255 - decByteTotal) + 1;
            decByteTotal = decByteTotal & 255;

            int a, b = 0;

            string hexByte = "", hexTotal = "";
            double i;

            for (i = 0; decByteTotal > 0; i++)
            {
                b = Convert.ToInt32(System.Math.Pow(16.0, i));
                a = decByteTotal % 16;
                decByteTotal /= 16;
                if (a <= 9)
                    hexByte = a.ToString();
                else
                {
                    switch (a)
                    {
                        case 10:
                            hexByte = "A";
                            break;
                        case 11:
                            hexByte = "B";
                            break;
                        case 12:
                            hexByte = "C";
                            break;
                        case 13:
                            hexByte = "D";
                            break;
                        case 14:
                            hexByte = "E";
                            break;
                        case 15:
                            hexByte = "F";
                            break;
                    }
                }
                hexTotal = String.Concat(hexByte, hexTotal);
            }
            return hexTotal;
        }

        /// <summary>
        /// RLC校验(异或 取反 加1<span style="font-family: Arial, Helvetica, sans-serif;">)</span>
        /// </summary>
        /// <param name="hexString"></param>
        /// <returns></returns>
        public static string CheckSumqy(string hexString)
        {
            hexString = hexString.Replace(" ", "");
            int strLen = hexString.Length / 2;

            //16进制转10进制
            int y = Convert.ToInt32(hexString.Substring(0, 2), 16);

            //异或运算
            for (int i = 0; i < strLen - 1; i++)
            {
                //16进制转10进制
                int x = Convert.ToInt32(hexString.Substring((i + 1) * 2, 2), 16);
                y ^= x;
            }

            //十进制转二进制
            string fy = Convert.ToString(y, 2);

            //二进制取反
            string fyf = "";
            for (int i = 0; i < fy.Length; i++)
            {
                if (fy.Substring(i, 1) == "1")
                {
                    fyf += "0";
                }
                else {
                    fyf += "1";
                }
            }

            //二进制转换为10进制加1
            int LRCx = Convert.ToInt32(fyf, 2) + 1;

            //10进制转换为16进制度
            string LRC = Convert.ToString(LRCx, 16);

            return LRC;
        }

        /// <summary>
        /// 求和 取反 加1
        /// </summary>
        /// <param name="hexstring"></param>
        /// <returns></returns>
        public static string CheckSumgz(string hexstring)
        {
            //压缩替换空格
            hexstring = hexstring.Replace(" ", "");
            int strLen = hexstring.Length / 2;

            //16进制转10进制
            int y = Convert.ToInt32(hexstring.Substring(0, 2), 16);

            //求和运算
            for (int i = 0; i < strLen - 1; i++)
            {
                //16进制转10进制
                int x = Convert.ToInt32(hexstring.Substring((i + 1) * 2, 2), 16);
                y += x;
            }

            int msgint = 255 - y % 256 + 1;

            hexstring = Convert.ToString(msgint, 16).ToUpper();
            if (hexstring.Length<2)
            {
                hexstring = "0" + hexstring;
            }
            return hexstring;
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值