一、C++版本:16进制字符串转换成16进制数组(初学者,留作记录,有问题欢迎评论指出)
刚开始学,只会用最基础的一些语法操作,所以代码看起来有点臃肿了。。后期慢慢改正
//16进制字符串转16进制数组,初学,可能方法比较笨
//char s[] = "AA DD bb cc 55 11 22 33 44 1 2 3"; 测试字符串
//uint16_t dat1[300]; 转换16进制后存储
//String_to_Hex(s, dat1, strlen(s)); 转换函数使用
void String_to_Hex(char* dats, uint16_t* datx, int len)
{
int flag = 0; //设一个标志,两个单字符串要合并成一个16进制
int j = 0; //用于16进制数组下标计数累加
uint16_t res[2]; //缓存单个字符转换16进制的结果
for (int i = 0; i < len; i++) //循环读取字符串直到转换完成
{
if (dats[i] >= '0' && dats[i] <= '9') //分类考虑16进制字符串每个字符转换16进制的计算方式
{
res[flag] = (uint16_t)dats[i] - 0x30;
flag = flag + 1;
}
else if (dats[i] >= 'a' && dats[i] <= 'f')
{
res[flag] = (uint16_t)dats[i] - 0x57;
flag = flag + 1;
}
else if (dats[i] >= 'A' && dats[i] <= 'F')
{
res[flag] = (uint16_t)dats[i] - 0x37;
flag = flag + 1;
}
else if (dats[i] == ' ') //带空格的16进制字符串处理
{
if (flag == 1) //两个空格之间有单个字符处理
{
datx[j] = res[0];
j++;
}
flag = 0;
}
else //如果输入的不是16进制字符串,输出一个错误提示
{
memset(&datx,0,1024);
cout << "输入不合法,请重新输入" << endl;
break;
}
if (flag == 2) //两个连续的字符合并成一个16进制存储
{
datx[j] = res[1] + (res[0] << 4);
j++;
flag = 0;
}
if (i == (len - 1)) //如果计算到最后一个字符发现是个单字符(前面一位是空格)处理
{
if (flag == 1)
{
datx[j] = res[0];
j++;
}
}
}
}
二、Qt:字符串转换十六进制
1、封装函数
//数据转换 字符串转十六进制
void uart::StringToHex(QString str, QByteArray &senddata)
{
int hexdata,lowhexdata;
int hexdatalen = 0;
int len = str.length();
senddata.resize(len/2);
char lstr,hstr;
for(int i=0; i<len; )
{
hstr=str[i].toLatin1();
if(hstr == ' ')
{
i++;
continue;
}
i++;
if(i >= len)
break;
lstr = str[i].toLatin1();
hexdata = convertHexChart(hstr);
lowhexdata = convertHexChart(lstr);
if((hexdata == 16) || (lowhexdata == 16))
break;
else
hexdata = hexdata*16+lowhexdata;
i++;
senddata[hexdatalen] = (char)hexdata;
hexdatalen++;
}
senddata.resize(hexdatalen);
}
//数据转换 字符串转16进制数据处理
char uart::convertHexChart(char ch)
{
if((ch >= '0') && (ch <= '9'))
return ch-0x30; // 0x30 对应 ‘0’
else if((ch >= 'A') && (ch <= 'F'))
return ch-'A'+10;
else if((ch >= 'a') && (ch <= 'f'))
return ch-'a'+10;
else
return ch-ch;//不在0-f范围内的会发送成0
}
2、函数调用示例
QString getmacS = ui->tableWidget->item(i,0)->text(); // 取出字符串
QByteArray getmacB; // 创建QByteArray数组
uart1->StringToHex(getmacS,getmacB); // 字符串转换16进制
三、Qt:16进制转换字符串
// savemacB为需要转换的16进制字节数组 QByteArray 类型
QString savemacS; // 定义转换后的字符串
QDataStream out(&savemacB,QIODevice::ReadOnly); // 将字节数组读入
while(!out.atEnd()) // 循环进行转换
{
qint8 outChar = 0;
out>>outChar; // 每字节填充一次,直到结束
//十六进制的转换
QString str = QString("%1").arg(outChar&0xFF,2,16,QLatin1Char('0'));
savemacS.append(str.toUpper()); // 转换后数据存入
savemacS.append(" "); // 每转换2字节加一个空格隔开
}