16进制字符串转字节数组
来源:互联网 发布:淘宝气值是什么意思 编辑:程序博客网 时间:2024/05/21 18:34
利用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
阅读全文
0 0
- 16进制字符串转字节数组
- 16进制字符串转字节数组
- 字符串转字节数组。
- 字节数组转字符串
- 16进制字符串与字节数组相互转换
- 16进制字符串和字节数组互相转换
- 字节数组转化为16进制字符串
- 字节数组格式化为16进制字符串
- 字节数组转化为16进制字符串输出
- 字节数组转换成16进制的字符串
- 字节数组与16进制字符串之间的转换
- 16进制与字符串、字节数组之间的转换
- 字节数组转16进制字符串,16进制字符串转字节数组,10进制字符串转16进制字符串,16进制字符串转10进制字符串
- C# 字符串转换成16进制字符串/字节数组转16进制字符串/各种类型之间的转换
- C# 16进制与字符串、字节数组之间的转换(转)
- C# 16进制与字符串、字节数组之间的转换(转)
- C# 16进制与字符串、字节数组之间的转换(转)
- C# 16进制与字符串、字节数组之间的转换(转)
- YAHFA--ART环境下的Hook框架
- QxOrm 的安装
- 数据库cpu负载高
- 《大型网站技术架构:核心原理与案例分析》拜读总结,第四章——瞬时响应:网站的高性能架构
- winform重新加载treeview时,出现闪烁
- 16进制字符串转字节数组
- 欢迎使用CSDN-markdown编辑器
- UVA133 The Dole Queue (模拟)
- java读取resource下xxx.properties配置文件内容
- Xilinx Vivado的使用详细介绍:使用IP核、例化IP
- 面试:----Spring常用注解
- HTTP 协议详解(工作很重要)
- PHP实现四种基本排序算法
- MFC新建工程