1 十六进制字节数转浮点数
注意:使用此函数时传入的参数格式 例如QString str1 = "068400040002847D";字符串中间没有空格
float MainWindow::hexBytesToFloat(const QString &hexString)
{QByteArray byteArray; // 创建一个QByteArray对象byteArrayfor (int i = hexString.size() - 2; i >= 0; i -= 2){bool ok;byteArray.append(hexString.mid(i, 2).toUInt(&ok, 16)); // 使用一个for循环遍历hexString中的每两个字符(因为一个字节由两个十六进制字符表示)并将它们转换为无符号整数,并追加到byteArray中。}float value; // 定义一个浮点数变量valuememcpy(&value, byteArray.constData(), sizeof(value)); // memcpy函数将byteArray中的数据复制到value的内存地址。 constData()方法获取byteArray的常量指针,以及sizeof(value)来指定要复制的字节数。return value;
}
2. 浮点数转十六进制字节数
传入需要转换的浮点数 转换结果格式为
“4042ee8b”
注意!中间没有空格
QString MainWindow::floatToHexBytes(float value)
{
// 将浮点型的地址强转换为字符指针型 然后使用这个指针和浮点数的大小(通常为4字节)创建一个QByteArray对象QByteArray byteArray(reinterpret_cast<const char*>(&value), sizeof(value)); // byteArray包含浮点数的二进制表示QString hexString; // 初始化一个空的QString对象,用于存储转换后的十六进制字符串。for (int i = byteArray.size()-1; i >=0; --i){// 循环内部,每次迭代都会取出一个字节,将其转换为无符号字符(以确保正确的十六进制表示),然后使用QString::arg方法将其格式化为两位的十六进制字符串。如果需要的话,会在左侧填充零。最后,将格式化后的字符串追加到hexString中。hexString.append(QString("%1").arg((unsigned char)byteArray.at(i), 2, 16, QChar('0')));}return hexString.toUpper();
}
中间有空格版本
QString floatToHexBytes1(float value)
{QByteArray byteArray(reinterpret_cast<const char*>(&value), sizeof(value));QString hexString;qDebug() << byteArray.size();for (int i = byteArray.size()-1; i >=0; --i){if (i >= 0){hexString.append(" ");}hexString.append(QString("%1").arg((unsigned char)byteArray.at(i), 2, 16, QChar('0')));}// 错的 字节反了
// for (int i = 0; i <= byteArray.size()-1; i++)
// {// hexString.append(QString("%1").arg((unsigned char)byteArray.at(i), 2, 16, QChar('0')));
// if (i <= byteArray.size()-1)
// {
// hexString.append(" ");
// }
// }return hexString.toUpper();
}
输出结果 注意前面那个空格