添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

利用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 == ' ' ) //若为空,不做操作跳过重新提取高位 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 ; hexdata = hexdata* 16 +lowhexdata; //构造ASCII值 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;
          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

文章最后发布于: 2017-05-26