16进制字符串转字节数组

利用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

猜你喜欢

转载自blog.csdn.net/qq_33557833/article/details/72764602