【问题标题】:Quickly convert raw data to hex string in c++在 C++ 中快速将原始数据转换为十六进制字符串
【发布时间】:2013-06-17 16:22:58
【问题描述】:

我正在从文件中读取数据并尝试将原始数据显示为 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”字符显示为“FFFFFFFFFFFFFFFF”?
  2. 有没有办法在不使用 QString::number 的情况下将 char 数据转换为 base 16 字符串?

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

【问题讨论】:

  • 为什么不在 C++ 中本地执行此操作,而不是使用 QString? stackoverflow.com/questions/10599068/… 你可以用 C++ 来做,然后把它塞进 QString 里?
  • 这看起来会更快,谢谢。

标签: c++ qt char


【解决方案1】:

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

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

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

【讨论】:

  • 一次放一个字符非常慢。 QString 可以从char* 缓冲区转换。但是QString不能包含二进制数据。
  • @Riateche 嗯,他没有将二进制数据放入 QString,而是将字节转换为十六进制表示(字符串),然后附加。但我同意你的 QByteArray 方法更好;我只是试图回答他的问题。
【解决方案2】:

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

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

【讨论】:

  • 好吧,这似乎是最好的答案。我什至不知道 QByteArray 存在,而且它似乎更适合这种事情。现在,如果我想在 QString 中添加其他字符,例如在每个 2 位十六进制值之间添加 '\t',在其中 16 个之后添加 '\n',该怎么办?看起来我可以做 QString.append(QByteArray),但不能做 QString.append(QByteArray[i])。有什么帮助吗?
  • 拥有十六进制表示后,最好使用 QString 来处理它。所以你有QString s = array.toHex();。现在您可以使用QString::insert 直接将字符插入字符串(但要仔细计算插入索引),或者您可以使用midRef 提取原始字符串的一部分,然后使用append 将它们附加到新字符串中。
  • 很好,我不知道。你会说与循环和执行 QString.append(array.at()) 相比有什么优势?会不会更快?
  • 要复制 2 位数字,您需要 2 次调用 array.at(和 append)或 1 次调用 midRef(和 append)。所以我想使用midRef 会稍微快一点。
猜你喜欢
  • 1970-01-01
  • 2021-08-11
  • 2014-05-13
  • 2018-01-31
  • 2021-06-24
  • 2018-01-03
相关资源
最近更新 更多