Быстрое преобразование необработанных данных в шестнадцатеричную строку в С++

Я читаю данные из файла и пытаюсь отобразить необработанные данные в виде двухзначных шестнадцатеричных строк.

Я использую структуру Qt, в частности QTextEdit.

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

В настоящее время это моя реализация:

1) Читайте в данных:

ifstream file (filePath, ios::in|ios::binary|ios::ate);
if (file.is_open())
{
    size = file.tellg();
    memblock = new char [size+1];
    file.seekg(0, ios::beg);
    file.read(memblock, size);
    file.close();
}

2) Создайте один QString, который будет использоваться (поскольку QTextEdit требует QString):

QString s;

3) Прокрутите массив, добавив каждый последующий символ в QString s.

int count = 0;
for(i=0;i<size;i++)
{
    count++;;
    s.append(QString::number(memblock[i], 16).toUpper());
    s.append("\t");
    if (count == 16)
    {
        s.append("\n");
        count -= 16;
    }
}

Теперь это работает отлично, за исключением случаев, когда он достигает символа FF, он выглядит как FFFFFFFFFFFFFFFF

Итак, мои основные вопросы:

  • Почему только символы "FF" отображаются вместо "FFFFFFFFFFFFFFFF"?
  • Есть ли способ преобразовать данные char в базовые 16 строк без использования QString:: number?

Я хочу, чтобы эта реализация была как можно быстрее, поэтому, если что-то вроде sprintf может работать, сообщите мне, так как я предполагаю, что может быть быстрее, чем QString:: number.

Ответ 1

QString не может использоваться для двоичных данных. Вместо этого вы должны использовать QByteArray. Его можно легко создать из буфера char* и его можно легко преобразовать в шестнадцатеричную строку с помощью toHex.

QByteArray array(memblock, size);
textEdit->setText(QString(array.toHex()));

Ответ 2

QString::number не имеет перегрузки, которая принимает char, поэтому ваш ввод продвигается до int; следовательно, вы видите эффекты расширения знака. Вы должны видеть подобное поведение для любого ввода, большего чем 0x7F.

Попробуйте использовать данные перед вызовом функции.

s.append(QString::number(static_cast<unsigned char>(memblock[i]), 16).toUpper());