13

我正在从文件中读取数据并尝试将原始数据显示为 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 的数组。

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;
    }
}

现在这工作正常,除非它到达一个 character FF,它显示为FFFFFFFFFFFFFFFF

所以我的主要问题是:

  1. 为什么只有“FF”字符显示为“FFFFFFFFFFFFFFFF”?
  2. 有没有办法在不使用 QString::number 的情况下将 char 数据转换为 base 16 字符串?

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

4

2 回答 2

21

QString不能用于二进制数据。你应该QByteArray改用。它可以很容易地从char*缓冲区创建,并且可以使用toHex.

QByteArray array(memblock, size);
textEdit->setText(QString(array.toHex()));
于 2013-06-20T17:29:53.637 回答
2

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

在调用函数之前尝试转换数据。

s.append(QString::number(static_cast<unsigned char>(memblock[i]), 16).toUpper());
于 2013-06-20T17:30:23.417 回答