C# 获取字符串转Hex格式和BCD格式

一、字符串转BCD格式

1、设计要求

上位机获取输入的年月日字符串,转换成BCD格式后传递到下位机。

输入一串序列号,最小1位,年最大4位;月和日最小一位,最大两位。

2、设施步骤

(1)获取字符串,判断字符串的长度是否符合要求。

(2)判读字符串是否是十进制数。

(3)字符串不满足要求位数,左边用0补齐。

(4)字符串转成BCD

3、程序代码


            //获取固件日期

            //年
            numbeString = CRCYear.Text;
            if (JudgeData(numbeString, 1, 4, 0))//判断输入的字符串最短一位,最长4位  数值0-9
            {
                verSetSerNum[16] = (string_to_BCD(numbeString)[1]);//转换成BCD码
                verSetSerNum[17] = (string_to_BCD(numbeString)[0]);
            }
            else
            {
                MessageBox.Show("年的格式不正确", "错误");
            }

            //月
            numbeString = CRCMonth.Text;
            if (JudgeData(numbeString, 1, 2, 0))//判断输入的字符串最短一位,最长2位   数值0-9
            {
                int[] num = new int[2];
                //字符串分割  2个字符串平均分成2个字符串
                string[] subString = new string[2];
                for (int i = 0; i < 2; i++)
                {
                    subString[i] = numbeString.Substring(i, 1);//字符串分割
                    num[i] = int.Parse(subString[i], System.Globalization.NumberStyles.HexNumber);//字符串转int类型
                }
                //先发送低位数据再发送高位数据

                verSetSerNum[18] = (byte)num[1];
                verSetSerNum[19] = (byte)num[0];
            }
            else
            {
                MessageBox.Show("月的格式不正确", "错误");
            }

            //日
            numbeString = CRCDay.Text;
            if (JudgeData(numbeString, 1, 2, 0))//判断输入的字符串最短一位,最长2位   数值0-9
            {
                int[] num = new int[2];
                //字符串分割  2个字符串平均分成2个字符串
                string[] subString = new string[2];
                for (int i = 0; i < 2; i++)
                {
                    subString[i] = numbeString.Substring(i, 1);//字符串分割
                    num[i] = int.Parse(subString[i], System.Globalization.NumberStyles.HexNumber);//字符串转int类型
                }
                //先发送低位数据再发送高位数据

                verSetSerNum[20] = (byte)num[1];
                verSetSerNum[21] = (byte)num[0];
            }
            else
            {
                MessageBox.Show("日的格式不正确", "错误");
            }
//日期格式判断

public bool JudgeData(string strMessage, int iMinLong, int iMaxLong, int f)
        {
            bool bResult = false;
            if (f == 1)
                number_string += strMessage;
            //开头匹配一个字母或数字+匹配两个十进制数字+匹配一个字母或数字+匹配两个相同格式的的(-加数字)+已字母或数字结尾  

            string pattern = @"^[0-9]*$"; //输入的字符串为十进制数
            if (strMessage.Length >= iMinLong && strMessage.Length <= iMaxLong)//判断字符串长度是否在要求范围内
            {
                if (System.Text.RegularExpressions.Regex.IsMatch(strMessage, pattern))//匹配所有字符都在字母和数字之间
                {
                    bResult = true;
                }
                else
                {
                    bResult = false;
                }
                //字符串的位数不满iMaxLong位时,左侧用0补齐
                if (strMessage.Length < iMaxLong)
                {
                    numbeString = numbeString.PadLeft(iMaxLong, '0');//字符串固定为iMaxLong为,不足左侧补0
                }
            }

            return bResult;
        }  

  //字符串转BCD码方法
        private static Byte[] string_to_BCD(string strTemp)
        {
            try
            {
                if (Convert.ToBoolean(strTemp.Length & 1))//若字符串的长度为奇数,则变为偶数 
                {
                    strTemp = "0" + strTemp;//数位为奇数时前面补0  
                }
                Byte[] aryTemp = new Byte[strTemp.Length / 2];
                for (int i = 0; i < (strTemp.Length / 2); i++)
                {
                    aryTemp[i] = (Byte)(((strTemp[i * 2] - '0') << 4) | (strTemp[i * 2 + 1] - '0'));//两个字节的数组成一个字节的BCD码0-9
                   // aryTemp[i] = (Byte)(((strTemp[i * 2])<< 4) | (strTemp[i * 2 + 1]));
                }
                return aryTemp;//高位在前  
            }
            catch
            {
                MessageBox.Show("set failed!");
                return null;
            } 
        }

二、字符串转Hex格式

1、设计要求

获取文本框中输入的16进制字符串,将其通过串口发送到下位机。

输入一串序列号,序列号最小1位,最大12位。

如输入20181009,则 hardwareVerSn[0]=0x1009,hardwareVerSn[1]=0x2018,hardwareVerSn[2]=0x0000

2、设施步骤

1)字符串长度判断:

(1)获取字符串,判断字符串的长度是否符合要求。

(2)判读字符串是否是16进制数。

(3)字符串不满足12位,左边用字符0补齐。

2)字符串转成hex

(1)字符串分割(12个字符串平均分割成6个字符串)

(2)分割后的每个字符串转int类型

(3)int类型转byte类型

3、程序

(1)获取输入的字符串

 numbeString = hardwareVerSn1.Text;

(2)判断字符串格式并转换

  if (JudgeVisionNum(numbeString, 1, 12, 0))//格式判断   最大输入12位数 每位数为0-f  不足12位前面补零
            {
                int[] num = new int[6];
                //字符串分割  12个字符串平均分成6个字符串
                string[] subString = new string[6];
                for (int i = 0; i < 6; i++)
                {
                    subString[i] = numbeString.Substring(i * 2, 2);//字符串分割
                    num[i] = int.Parse(subString[i], System.Globalization.NumberStyles.HexNumber);//字符串转int类型
                }
                //先发送低位数据再发送高位数据
                verSetSerNum[2] = (byte)num[5];//int转byte类型
                verSetSerNum[3] = (byte)num[4];
                verSetSerNum[4] = (byte)num[3];
                verSetSerNum[5] = (byte)num[2];
                verSetSerNum[6] = (byte)num[1];
                verSetSerNum[7] = (byte)num[0];
                 
            }


        //判断版本号是否符合要求
        public bool JudgeVisionNum(string strMessage, int iMinLong, int iMaxLong, int f)
        {
            bool bResult = false;
            if (f == 1)
                number_string += strMessage;
            //开头匹配一个字母或数字+匹配两个十进制数字+匹配一个字母或数字+匹配两个相同格式的的(-加数字)+已字母或数字结尾  

          //  string pattern = @"^[0-9]*$"; 
            string pattern = @"^[0-9A-Fa-f]+$";//匹配十六进制
            if (strMessage.Length >= iMinLong && strMessage.Length <= iMaxLong)//判断字符串长度是否在要求范围内
            {
                if (System.Text.RegularExpressions.Regex.IsMatch(strMessage, pattern))//匹配所有字符都在字母和数字之间
                {
                    bResult = true;
                }
                else
                {
                    bResult = false;
                }
                //字符串的位数不满iMaxLong位时,左侧用0补齐
                if(strMessage.Length < iMaxLong)
                {
                    numbeString = numbeString.PadLeft(iMaxLong, '0');//字符串固定为iMaxLong为,不足左侧补0
                }
            }

            return bResult;
        } 

猜你喜欢

转载自blog.csdn.net/kenjianqi1647/article/details/82988466