1、将字母转为大写并检查字符串中是否含有不合法的字符(0~9 A~F)
static QRegularExpression hexRegex("^[0-9A-F]+$"); // 定义为静态成员
hexRegex.match(toQHexStr).hasMatch() // 检查字符串是否只包含十六进制字符
2、根据字符串的大小来定义数据类型
例如:"00 FF CD 00" 占四个字节,对应 int 类型;
int value = 0;
// 移除空格并转换为大写以符合QHex的要求
QString toQHexStr = hexStr.trimmed().toUpper().replace(" ", "");
value = toQHexStr.toInt(&success, 16);
注意:如果字符串为"FF FF FF FF" value转化出来的值本应该为-1;但是toInt接口会报错,它只能转化0~7F FF FF FF之间的正数;(int类型可表示的最大正数值为7F FF FF FF)
3、数据在计算机中都是以补码的方式进行存储的,因此采用uint进行转化,最后将uint数值转为int类型,这样就可以得到一个负数了!
#include <QRegularExpression>
int controlThread::HexStringToValue(const QString &hexStr)
{
uint value = 0;
static QRegularExpression hexRegex("^[0-9A-F]+$"); // 定义为静态成员
// 移除空格并转换为大写以符合QHex的要求
QString toQHexStr = hexStr.trimmed().toUpper().replace(" ", "");
//qDebug() << "HexStringToValue string:" << toQHexStr;
// 检查字符串是否只包含十六进制字符
if (hexRegex.match(toQHexStr).hasMatch())
{
bool success = true;
value = toQHexStr.toUInt(&success, 16); //十六进制字符串转换只能转为正数
if (!success)
{
qDebug() << "HexStringToValue failed for string:" << toQHexStr;
return 0;
}
}
qDebug() << "HexStringToValue uint:" << value;
return (int)value;
}