Как преобразовать QBytearray BCD в десятичное представление QString?

Привет, я прочитал упакованный BCD из файла, который хочу преобразовать в десятичное представление. длина данных составляет 32 байта, и, например, это то, что находится в файле:

95 32 07 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 01 00 13 00

Я хочу показать данные как есть, как я могу это сделать?

Спасибо, шеф, это сработало для меня. У меня есть еще один вопрос: данные, которые я прочитал, некоторые из данных представляют собой числовые данные в необработанном шестнадцатеричном формате для eeample:

22 d8 ce 2d

что должно интерпретироваться как:

584633901

как лучше и быстрее всего? в настоящее время я делаю это так:

QByteArray DTByteArray("\x22 \xd8 \xce \x2d");
QDataStream dstream(DTByteArray);
dstream.setByteOrder(QDataStream::BigEndian);
qint32 number;
dstream>>number;

а для 1- и 2-байтовых целых чисел я делаю это так:

QString::number(ain.toHex(0).toUInt(Q_NULLPTR,16));

person pumper    schedule 23.07.2018    source источник
comment
В общем, один вопрос на вопрос. По поводу вашей второй проблемы: это возможный способ, хотя я не уверен, что самый быстрый. Другим вариантом было бы сделать это на простом C++ с битовыми операторами.   -  person Scheff's Cat    schedule 23.07.2018


Ответы (1)


Я начал искать QByteArray, доступно ли что-то подходящее, но я не смог найти что-нибудь. Поэтому я просто написал цикл.

testQBCD.cc:

#include <QtWidgets>

int main()
{
  QByteArray qBCD(
    "\x95\x32\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x13\x00",
    32);
  QString text; const char *sep = "";
  for (unsigned char byte : qBCD) {
    text += sep;
    if (byte >= 10) text += '0' + (byte >> 4);
    text += '0' + (byte & 0xf);
    sep = " ";
  }
  qDebug() << "text:" << text;
  return 0;
}

testQBCD.pro:

SOURCES = testQBCD.cc

QT += widgets

Скомпилируйте и протестируйте (cygwin64, Window 10 64 бит):

$ qmake-qt5 

$ make
g++ -c -fno-keep-inline-dllexport -D_GNU_SOURCE -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -isystem /usr/include/qt5 -isystem /usr/include/qt5/QtWidgets -isystem /usr/include/qt5/QtGui -isystem /usr/include/qt5/QtCore -I. -I/usr/lib/qt5/mkspecs/cygwin-g++ -o testQBCD.o testQBCD.cc
g++  -o testQBCD.exe testQBCD.o   -lQt5Widgets -lQt5Gui -lQt5Core -lGL -lpthread 

$ ./testQBCD 
text: "95 32 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 13 0"

$

Надеюсь, я правильно истолковал термин «упакованный BCD». Я думаю, что да (по крайней мере, согласно Википедии двоично-десятичный упакованный BCD ). Если поддержка знака станет проблемой, это будет означать некоторую дополнительную битовую перестановку.

person Scheff's Cat    schedule 23.07.2018
comment
Привет, спасибо, это сработало для меня. У меня есть еще один вопрос: - person pumper; 23.07.2018