在c++中快速将原始数据转换为十六进制字符串
Quickly convert raw data to hex string in c++
我正在从文件中读取数据,并试图将原始数据显示为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
所以我的主要问题是:
- 为什么只有"FF"字符显示为"FFFFFFFFFFFFF"
- 有没有一种方法可以在不使用QString::number的情况下将char数据转换为以16为基的字符串
我希望这个实现尽可能快,所以如果像sprintf这样的东西可以工作,请告诉我,因为我想这可能比QString::number更快。
QString
不能用于二进制数据。您应该使用QByteArray
。它可以很容易地从char*
缓冲区创建,并且可以使用toHex
很容易地转换为十六进制字符串。
QByteArray array(memblock, size);
textEdit->setText(QString(array.toHex()));
QString::number
没有占用char
的重载,因此您的输入被提升为int
;因此你看到了符号扩展的效果。对于大于0x7F
的任何输入,您都应该看到类似的行为。
在调用函数之前,请尝试强制转换数据。
s.append(QString::number(static_cast<unsigned char>(memblock[i]), 16).toUpper());
相关文章:
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 为什么mpfr_printf与十六进制浮点(%a转换说明符)的printf不同
- 如何在C++中将十六进制字符串转换为文本数据
- 使用 sprintf 将十六进制0xAABBCC转换为字符串"AA:BB:CC"
- 如何将带有十六进制值的 std::string 转换为 std::vector<无符号字符>
- 将字符串(可以是十进制字符串或十六进制字符串)转换为整数C++
- 在Arduino中将字符串转换为(逗号分隔的十六进制)字符串到无符号字符数组
- 将 std::string( "x3BxDEx7C" ) 转换为可读的十六进制字符串?
- 将十六进制转换为 DEC
- C++ 将十六进制字符串表示形式转换为十六进制字符串表示形式
- 字符数组到十六进制字符串的转换 - 意外输出
- C++将 wwn 字符串转换为识别为十六进制的数据类型
- 将字符串存储为十六进制而不进行转换
- 将字符串转换为十六进制数组c++
- 十六进制到十进制转换的未清理答案
- 是否有函数或公式可以在 c++ 中将字符串"of letters"转换为十六进制
- C++十六进制字符串转换为十六进制的字符 *
- 转换十六进制并存储为字节