Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 快速将原始数据转换为c++;_C++_Qt_Char - Fatal编程技术网

C++ 快速将原始数据转换为c++;

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

我正在从文件中读取数据,并试图将原始数据显示为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):

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;i
QString
不能用于二进制数据。您应该改用
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());