我正在从文件中读取数据并尝试将原始数据显示为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
所以我的主要问题是:
我希望这个实现尽可能快,所以如果像sprintf这样的东西可以工作,请告诉我,因为我猜想QString :: number可能会更快。
答案 0 :(得分:17)
QString
不能用于二进制数据。您应该使用QByteArray
代替。它可以从char*
缓冲区轻松创建,并可以使用toHex
轻松转换为十六进制字符串。
QByteArray array(memblock, size);
textEdit->setText(QString(array.toHex()));
答案 1 :(得分:2)
QString::number
没有带char
的重载,因此您的输入被提升为int
;因此你看到了符号扩展的影响。对于任何大于0x7F
的输入,您应该会看到类似的行为。
在调用函数之前尝试转换数据。
s.append(QString::number(static_cast<unsigned char>(memblock[i]), 16).toUpper());