一、字符串转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;
}