16进制字符串转字节数组

时间:2021-12-02 19:02:15

利用Qt的QSring,QByteArray
将16进制数的字符串转化为相对应的字符数组
例如 48 65 6c 6C 6f 20 57 6f 72 6c 64 21 转化为 Hello World!

转化过程大致为:
1、将相应的的16进制数转化为ASCII值(16进制数的48 对应 ASCII值的 72、16进制数的6c 对应 ASCII值的 99);
2、再将对应的ASCII值转化为字符(ASCII值的 72 对应 H、ASCII值的 99 对应 o);
3、将转化后的字符保存到返回的字符串中;


/*
*****************************************************************
* 函 数 名 : ConvertHexChar
* 功能说明 : 将十六进制字符数转为十进制数:A-10、B-11、...
* 形 参 :
* 返 回 值 :
*****************************************************************
*/

static char ConvertHexChar(char ch)
{
if((ch >= '0') && (ch <= '9'))
return ch-0x30;
else if((ch >= 'A') && (ch <= 'F'))
return ch-'A'+10;
else if((ch >= 'a') && (ch <= 'f'))
return ch-'a'+10;
else return (-1);
}


/*
*********************************************************
* 函 数 名 : HexStrToByteArray
* 功能说明 : 16进制字符串转字节数组
* 形 参 :
* 返 回 值 :
*********************************************************
*/

static QByteArray HexStrToByteArray(QString str)
{
QByteArray senddata; //保存转化后的ASCII码字符串
char lstr, //保存传进来的16进指数低位数
hstr; //保存传进来的16进制数高位数
int hexdata, //保存传进来的16进指数低位数的转化值
lowhexdata; //保存传进来的16进制数高位数的转化值
int hexdatalen = 0; //记录转化后的字符串长度
int len = str.length(); //获取传进来的16进制字符串长度
senddata.resize(len/2); //重新定义字符串长度

//开始转化
for(int i=0; i<len; )
{
hstr=str[i].toLatin1(); //提取高位
if(hstr == ' ') //若为空,不做操作跳过重新提取高位
{
i++;
continue;
}
i++; //指向低位
if(i >= len) //转化完成退出转化
break;
lstr = str[i].toLatin1();//提取低位
hexdata = ConvertHexChar(hstr);//将十六进制字符数转为十进制数:A-10、B-11、...
lowhexdata = ConvertHexChar(lstr);//将十六进制字符数转为十进制数:A-10、B-11、...

/* **打印转化后的信息,测试时可取消注释** */
// qDebug()<<"\n hexdatalen = "<<hexdatalen
// <<" hstr = "<<hstr<<" lowhexdata = "<<lowhexdata
// <<" hexdata = "<<hexdata<<" lowhexdata = "<<lowhexdata;
if((hexdata == 16) || (lowhexdata == 16))//有误直接退出
break;
else
hexdata = hexdata*16+lowhexdata;//构造ASCII值
i++;

senddata[hexdatalen] = (char)hexdata;//强制将ASCII值转化为相对应的字符
/* **打印转化后的信息,测试时可取消注释** */
// qDebug()<<QString(" hexdata 1 = %1 senddata[%2] 1 = %3").arg(QString::number(hexdata,10),QString::number(hexdatalen,10),QString((char)hexdata));
hexdatalen++;
}
senddata.resize(hexdatalen);
return senddata;
}
/*
*********************************************************
* 函 数 名 : ByteArrayToHexStr
* 功能说明 : 字节数组转16进制字符串
* 形 参 :
* 返 回 值 :
*********************************************************
*/


static QString ByteArrayToHexStr(QByteArray data)
{
QString temp="";
QString hex=data.toHex();
for (int i=0;i<hex.length();i=i+2)//每个16进制间隔插入空格
{
temp+=hex.mid(i,2)+" ";
}
return temp.trimmed().toUpper();
}
/*
*********************************************************
* 函 数 名 : MainWindow
* 功能说明 : 主函数
* 形 参 :
* 返 回 值 :
*********************************************************
*/


MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

//出入的十六进制数字符串不区分大小写,如:16进制数的6c和6C出来的结果都是小写的字符'l'、下面初始化十六进制数字符串出来的结果是一样的均为 Hello World!
// QString hex_data ="48656c6C6f20576f726c6421";
QString hex_data ="48 65 6c 6C 6f 20 57 6f 72 6c 64 21";
//16进制字符串转字节数组
QByteArray outData;
outData=HexStrToByteArray(hex_data);
qDebug()<<"outData.size ="<<outData.size() <<"s_str = "<< outData.data();
//字节数组转16进制字符串
hex_data = ByteArrayToHexStr(outData);
qDebug()<<"hex_data.size ="<<hex_data.size() <<"s_str = "<< hex_data;

}

//运行结果为
outData.size = 12 s_str = Hello World!
hex_data.size = 35 s_str = “48 65 6C 6C 6F 20 57 6F 72 6C 64 21”

其他转化仅供参考:

  //16进制字符串转10进制
static int StrHexToDecimal(QString strHex)
{
bool ok;
return strHex.toInt(&ok,16);
}

//10进制字符串转10进制
static int StrDecimalToDecimal(QString strDecimal)
{
bool ok;
return strDecimal.toInt(&ok,10);
}

//2进制字符串转10进制
static int StrBinToDecimal(QString strBin)
{
bool ok;
return strBin.toInt(&ok,2);
}

//16进制字符串转2进制字符串
static QString StrHexToStrBin(QString strHex)
{
//uchar最大值为255,可将uchar类型改为其他类型如int型等来改变其允许的最大值
uchar decimal=StrHexToDecimal(strHex);
QString bin=QString::number(decimal,2);

uchar len=bin.length();

if (len<8)
{
for (int i=0;i<8-len;i++)
{
bin="0"+bin;
}
}

return bin;
}

//10进制转2进制字符串一个字节
static QString DecimalToStrBin1(int decimal)
{
QString bin=QString::number(decimal,2);

uchar len=bin.length();

if (len<=8)
{
for (int i=0;i<8-len;i++)
{
bin="0"+bin;
}
}

return bin;
}

//10进制转2进制字符串两个字节
static QString DecimalToStrBin2(int decimal)
{
QString bin=QString::number(decimal,2);

uchar len=bin.length();

if (len<=16)
{
for (int i=0;i<16-len;i++)
{
bin="0"+bin;
}
}

return bin;
}

//计算校验码
static uchar GetCheckCode(uchar data[],uchar len)
{
uchar temp=0;

for (uchar i=0;i<len;i++)
{
temp+=data[i];
}

return temp%256;
}

//将溢出的char转为正确的uchar
static uchar GetUChar(char data)
{
uchar temp;

if (data>127)
{
temp=data+256;
}
else
{
temp=data;
}
return temp;
}



//调用测试
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

//获取32位系统允许的最大int值,及其十六进制数表示数
int max = (1<<31)-1;
QString hex_data ="7fffffff";

int ten_int = StrHexToDecimal(hex_data);//若返回值大于系统允许的最大int值则返回值为0
qDebug()<<"ten_int ="<<ten_int;

int ten_ten = StrDecimalToDecimal(QString::number(max,10));//若返回值大于系统允许的最大int值则返回值为0
qDebug()<<"ten_ten ="<<ten_ten;
int bin_ten = StrBinToDecimal("1111111111111111111111111111111");//允许最大输入为系统允许的最大int值,超出其值返回0
qDebug()<<"bin_ten ="<<bin_ten;

// hex_data ="7fffffff";但只提取最后两位数ff进行运算
QString hex_bin = StrHexToStrBin(hex_data);
qDebug()<<"hex_bin ="<<hex_bin;


//max = (1<<31)-1;
QString dec_bin = DecimalToStrBin1(max);
qDebug()<<"dec_bin ="<<dec_bin;

QString dec_bin2 = DecimalToStrBin2(max);
qDebug()<<"dec_bin2 ="<<dec_bin2;

uchar data[2]={123,321};
uchar tmp = GetCheckCode(data,2);
qDebug()<<"tmp1 ="<<tmp;
tmp = GetUChar(48);
qDebug()<<"tmp3 ="<<tmp;
tmp = GetUChar(255);//允许输入最大值为255
qDebug()<<"tmp4 ="<<tmp;
tmp = GetUChar(-1);// 返回值 :char : -1+256 = 255
qDebug()<<"tmp5 ="<<tmp;
tmp = GetUChar(-127);//返回值 : char :-127+256 = 129
qDebug()<<"tmp6 ="<<tmp;
tmp = GetUChar(-256);//返回值 : char: -256+256 = 0
qDebug()<<"tmp7 ="<<tmp;
tmp = GetUChar(-255);//返回值 :char: -255+256 = 1
qDebug()<<"tmp8 ="<<tmp;
tmp = GetUChar(-300);//返回值 : char: -300+256 = -42---> uchar: 256-42 = 212
qDebug()<<"tmp9 ="<<tmp;
tmp = GetUChar(-257);//返回值 : char: -257+256 = -1---> uchar: 256-1 = 255
qDebug()<<"tmp10 ="<<tmp;
}

运行结果:
ten_int = 2147483647
ten_ten = 2147483647
bin_ten = 2147483647
hex_bin = “11111111”
dec_bin = “1111111111111111111111111111111”
dec_bin2 = “1111111111111111111111111111111”
tmp1 = 188
tmp3 = 48
tmp4 = 255
tmp5 = 255
tmp6 = 129
tmp7 = 0
tmp8 = 1
tmp9 = 212
tmp10 = 255