C++ 快速将原始数据转换为c++;
我正在从文件中读取数据,并试图将原始数据显示为2位十六进制字符串 我使用的是Qt框架,特别是QTextEdit 我尝试了很多不同的方法,几乎完成了我想要它做的事情,但是它有一些意想不到的错误,我对此一无所知 目前这是我的实现: 1) 读入数据:C++ 快速将原始数据转换为c++;,c++,qt,char,C++,Qt,Char,我正在从文件中读取数据,并试图将原始数据显示为2位十六进制字符串 我使用的是Qt框架,特别是QTextEdit 我尝试了很多不同的方法,几乎完成了我想要它做的事情,但是它有一些意想不到的错误,我对此一无所知 目前这是我的实现: 1) 读入数据: ifstream file (filePath, ios::in|ios::binary|ios::ate); if (file.is_open()) { size = file.tellg(); memblock = new char
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):
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;
}
}
int count=0;
对于(i=0;iQString
不能用于二进制数据。您应该改用QByteArray
。它可以从char*
缓冲区轻松创建,并且可以使用toHex
轻松转换为十六进制字符串
QByteArray array(memblock, size);
textEdit->setText(QString(array.toHex()));
没有采用char
的重载,因此您的输入被提升为int
;因此您看到了符号扩展的效果。对于任何大于0x7F
的输入,您应该看到类似的行为
在调用函数之前尝试强制转换数据
s.append(QString::number(static_cast<unsigned char>(memblock[i]), 16).toUpper());
s.append(QString::number(static_cast(memblock[i]),16.toUpper());
< C++ >为什么不在C++中使用这个字符串而不是使用QStand?你可以在C++中做它,然后把它推到QStk中。这看起来也快得多,谢谢。每次放一个字符非常慢。QStand可以从 char */Cuff>缓冲区转换。但是QStand不能包含二进制数据。@ RiaTech-UMM,他不把二进制文件放进去。数据转换为QString,他将字节转换为十六进制表示(字符串)但我同意你的QByteArray方法更好;我只是试图回答他的问题。好吧,这似乎是最好的答案。我甚至不知道QByteArray的存在,它似乎更适合这种情况。现在,如果我想在QString中附加其他字符,比如在每个2位数之间的“\t”,该怎么办t hex值,其中16个之后是“\n”?看起来我可以做QString.append(QByteArray),但不能做QString.append(QByteArray[I])。有什么帮助吗?在有了十六进制表示法之后,最好使用QString来处理它。所以你有QString s=array.toHex()现在您可以使用QString::insert
直接在字符串中插入字符(但要仔细计算插入索引),或者您可以使用midRef
提取原始字符串的一部分,并使用append
将其附加到新字符串中。很好,我不知道这一点。您认为与循环和执行QString.append(array.at())相比,它的优点是什么?会更快吗?要复制2个数字,您需要调用两次array.at
(和append
)或一次调用midRef
(和append
)。因此我想使用midRef
会稍微快一些。
s.append(QString::number(static_cast<unsigned char>(memblock[i]), 16).toUpper());