在c++中快速将原始数据转换为十六进制字符串

Quickly convert raw data to hex string in c++

本文关键字:转换 十六进制 字符串 原始数据 c++      更新时间:2023-10-16

我正在从文件中读取数据,并试图将原始数据显示为2位十六进制字符串。

我使用的是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

所以我的主要问题是:

  1. 为什么只有"FF"字符显示为"FFFFFFFFFFFFF"
  2. 有没有一种方法可以在不使用QString::number的情况下将char数据转换为以16为基的字符串

我希望这个实现尽可能快,所以如果像sprintf这样的东西可以工作,请告诉我,因为我想这可能比QString::number更快。

QString不能用于二进制数据。您应该使用QByteArray。它可以很容易地从char*缓冲区创建,并且可以使用toHex很容易地转换为十六进制字符串。

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

QString::number没有占用char的重载,因此您的输入被提升为int;因此你看到了符号扩展的效果。对于大于0x7F的任何输入,您都应该看到类似的行为。

在调用函数之前,请尝试强制转换数据。

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