有一种简单的方法可以使用带有十六进制字符串的QVariant类吗?

时间:2012-02-09 10:35:48

标签: qt hex qvariant

此代码示例正如我所料:

v = QVariant("123456");
qDebug() << v; // QVariant(QString, "123456")
v.convert(QVariant::Int);
qDebug() << v; // QVariant(int, 123456)
v.convert(QVariant::String);
qDebug() << v; // QVariant(QString, "123456")

这不是:

v = QVariant("0xBEEF");
qDebug() << v; // QVariant(QString, "0xBEEF")
v.convert(QVariant::Int);
qDebug() << v; // QVariant(int, 0)
v.convert(QVariant::String);
qDebug() << v; // QVariant(QString, "")

有没有简单的方法可以让QVariant类使用十六进制字符串,所以第二个例子可以这样工作:

v = QVariant("0xBEEF");
qDebug() << v; // QVariant(QString, "0xBEEF")
v.convert(QVariant::Int);
qDebug() << v; // QVariant(int, 48879)
v.convert(QVariant::String);
qDebug() << v; // QVariant(QString, "48879")

2 个答案:

答案 0 :(得分:2)

将qvariant转换为数值时,需要指定基数。还要确保该值适合int / long / longlong,否则转换将因此失败。

QVariant v = QVariant("0xDEADBEAF");
bool test;
qDebug() << v.toString().toLongLong(&test,16);
qDebug() << test;

将产生正确的输出

3735928495 
true 

QVariant v = QVariant("0xDEADBEAF");
bool test;
qDebug() << v.toString().toInt(&test,16);
qDebug() << test;

将输出

0
false

答案 1 :(得分:1)

this answer关于数字溢出的观点之后,我做了一些调查,看起来QVariant的转换例程存在缺陷。安全转换QVariant的最简单方法是使用QString的转换。这似乎也是使用十六进制字符串的QVariant的最简单方法。我在下面总结了我的发现。评论将是在代码中该点调用qDebug() << v;的结果输出。

场景1:存储为十六进制字符串的数字

v = QVariant("0xBEEF"); // 'QVariant(QString, "0xBEEF") '
v = v.toString().toInt(0, 16); // 'QVariant(int, 48879) '

v = QVariant("0xDEADBEEF"); // 'QVariant(QString, "0xDEADBEEF") '
v = v.toString().toInt(0, 16); // 'QVariant(int, 0) '

将字符串表示一个十进制数字转换为数字类型的最简单,最安全的方法是使用QString的toInt(bool * ok = 0, int base = 10)方法。

场景2:存储为十进制字符串的数字

v = QVariant("123456"); // 'QVariant(QString, "123456") '
v.convert(QVariant::Int); // 'QVariant(int, 123456) '

QVariant的convert(Type t)方法在这种情况下可以正常工作。

v = QVariant("2147483649"); // 'QVariant(QString, "2147483649") '
v.convert(QVariant::Int); // 'QVariant(int, -2147483647) '

v = QVariant("9223372036854775807"); // 'QVariant(QString, "9223372036854775807") '
v.convert(QVariant::Int); // 'QVariant(int, -1) '

但是,当字符串包含对于数据类型而言过大的数字时,使用相同的方法会导致静默溢出,而不是执行更有用的操作,例如返回false并将QVariant设置为0。

v = QVariant("2147483649"); // 'QVariant(QString, "2147483649") '
v = v.toString().toInt(); // 'QVariant(int, 0) '

v = QVariant("9223372036854775807"); // 'QVariant(QString, "9223372036854775807") '
v = v.toString().toInt(); // 'QVariant(int, 0) '

通过使用与场景1中相同的方法,可以防止这种情况发生,并使用*bool的可选toInt()参数来提醒失败。