1. 首先上代码, 这是在qt语言上的操作
截取 01 03 0C 00 00 00 00 00 00 00 0C 00 0C 00 0C 93 70 这串16进制数值进行处理,截取这样一段内容
00 0C 00 0C 00 0C
- 字节数组转字符串。从bytearray数组转换为string.
QString CustomTcpSocket::recieveInfo()
{QByteArray byteArray = this->readAll();QString reciveInfoMsg = byteArray.toHex();qDebug() << "socket.devNumber: " << this->devNumber << ", devName: " << this->devName << ", message: " << reciveInfoMsg;// 持久化记录消息, 记录原始记录durationMsg(reciveInfoMsg, Myapp::COMM_DIRECT[1].toInt());byteArray.clear();byteArray = QByteArray::fromHex(reciveInfoMsg.toUtf8());// 十六进制字节数组转换未asciiQString asciiString = QString::fromUtf8(byteArray);byteArray.clear();return QString("%1,%2").arg(asciiString).arg(reciveInfoMsg);
}
- 截取字符串对应字符。截取这样一部分,
int ab = getIntResultByIndex(asciiString, 4);
通过变换第二个参数, 传入4,5,6获取到十进制的数字
// --------- 解析设备回应的电流等数据↓
int CustomTcpSocket::getIntResultByIndex(const QString &hexString, int index)
{QString wantStr = hexString.mid(3*2+((index-1)*4), 4);QByteArray arylen = QByteArray::fromHex(wantStr.toLocal8Bit());return hexToInt(wantStr.toLocal8Bit()).toInt();
}/*** 16进制字符串转10进制字符串, 如"0c"转换后为"12"* 1. 转换通过对每一个字符转16进制bytearray后取值转quint8操作的* 2. 在对每一位转换10进制后进行数值的累加计算10进制结果*/
QString CustomTcpSocket::hexToInt(const QByteArray &byteAry)
{// 计算结果累加,每一位进行计算int calcResult = 0;for (int i = byteAry.size() - 1, j=0; i >=0 ; i--, j++){// 转化为stringQString hexChar = QString(byteAry[j]);// 转化为16进制字节数组QByteArray haxCharAry = QByteArray::fromHex(hexChar.toUtf8());// 转化为无符号的int8类型quint8 hexInt = static_cast<quint8>(static_cast<unsigned char>(haxCharAry[0]));// 16的j次方, 此处需引入<cmath>进行计算double xy = pow(16, i);// 计算结果 000c: 0*16^3 + 0*16^2 + 0*16^1 + 12*16^0double res = hexInt * xy;calcResult += res;
// qDebug() << "res:" << calcResult;}return QString::number(calcResult);
}