首页 文章

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

提问于
浏览
12

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

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

所以我的主要问题是:

  • Why do only the 'FF' characters appear as 'FFFFFFFFFFFFFFFF' instead?

  • Is there a way to convert the char data to base 16 strings without using QString::number?

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

2 回答

  • 2

    QString 不能用于二进制数据 . 你应该使用 QByteArray 代替 . 它可以从 char* 缓冲区轻松创建,并可以使用 toHex 轻松转换为十六进制字符串 .

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

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

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

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

相关问题