Быстрое преобразование необработанных данных в шестнадцатеричную строку в С++
Я читаю данные из файла и пытаюсь отобразить необработанные данные в виде двухзначных шестнадцатеричных строк.
Я использую структуру 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());