16进制字符串转换成16进制数组

一、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字节加一个空格隔开
}

你可能感兴趣的:(C++,c++)