【问题标题】:Qt5: toLongLong failsQt5:toLongLong 失败
【发布时间】:2018-07-06 07:06:39
【问题描述】:

我正在尝试将包含十六进制格式值的QByteArray 转换为long long

QByteArray field = "A8BC301F0193E83F";
bool ok;
qlonglong val = field.toLongLong(&ok, 16);
qDebug() << ok << val;

输出:

假0

相反,我期待 val = -6.288.098.069.987.465.153。

为什么会失败?文档没有说明此功能的任何限制。

我忘了提到源中的数据顺序是小端。

【问题讨论】:

  • 要获得预期的输出,您需要像QByteArray field = "-5743CFE0FE6C17C1"; 这样写,不是吗?不过,您的 A8BC301F0193E83F 数字表示该数字的十六进制符号二进制补码。
  • “字段”变量应该包含数字的位表示。是应该处理标志的转换(如果有的话)。我错了吗?

标签: c++ qt qt5


【解决方案1】:

您的号码超出了signed long long 的限制,因此转换失败。

您可以改用QByteArray::toULongLong,然后转换为long long

#include <qbytearray.h>
#include <qdebug.h>

int main(int argc, char* argv[])
{
  QByteArray field = "A8BC301F0193E83F";
  bool ok;
  qlonglong val = field.toLongLong(&ok, 16);
  qDebug() << ok << val;

  qulonglongval_u = field.toULongLong(&ok, 16);
  qDebug() << ok << val_u << (long long)val_u;

  long long check = 0xA8BC301F0193E83F;
  qDebug() << check;

  return 0;
}

编辑:您可以查看相关帮助函数的source code,并发现这确实是有符号整数和无符号整数之间的情况。

【讨论】:

    【解决方案2】:

    你可以在qlocale.cpp函数static qlonglong qstrtoll中找到将ByteArray转换为long long的最终函数Qt调用

    它定义了 cutoff = neg ? qulonglong(0-(LLONG_MIN + LLONG_MAX)) + LLONG_MAX : LLONG_MAX;.

    所以如果negcutoff 将是0x8000000000000000,如果不是neg,则将是0x7fffffffffffffff

    您的输入值大于cutoff,因此它返回false

    您可以获取static qlonglong qstrtoll函数并自行调试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-26
      • 2017-02-26
      • 2015-04-13
      • 2014-04-03
      • 2013-06-25
      • 1970-01-01
      相关资源
      最近更新 更多