Qt5: toLongLong терпит неудачу - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь преобразовать 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.

Почему это не получается? В документах ничего не говорится о каких-либо ограничениях этой функции.

Я забыл упомянуть, что порядок данных в источнике является прямым порядком байтов.

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Вы можете найти последний вызов функции Qt для преобразования ByteArray в long long здесь qlocale.cpp в функции static qlonglong qstrtoll

определяет cutoff = neg ? qulonglong(0-(LLONG_MIN + LLONG_MAX)) + LLONG_MAX : LLONG_MAX;.

То есть cutoff будет 0x8000000000000000, если neg, или будет 0x7fffffffffffffff, если не neg.

.

Ваше входное значение больше cutoff, поэтому возвращается false.

Вы можете получить функцию static qlonglong qstrtoll и отладить ее самостоятельно.

0 голосов
/ 06 июля 2018

Ваше число превышает пределы 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;
}

РЕДАКТИРОВАТЬ: вы можете взглянуть на исходный код связанной вспомогательной функции и увидеть, что это действительно так между знаковыми и беззнаковыми целыми числами.

...