QByteArray转十六进制、二进制、字符表格遇转义序列问题求助
解决QByteArray转十六进制、二进制、字符表格的简便方法
先修正你的基础代码问题
你提供的示例代码里,QString::number(0, 16)是固定输出0,根本没遍历QByteArray里的元素,这是核心错误。正确的做法是取出QByteArray的每个字节来处理。
简便实现方法
Qt本身提供了很多工具函数,不用手动逐个判断ASCII范围:
1. 逐字节生成十六进制、二进制和字符表示
#include <QByteArray> #include <QString> #include <iostream> void printByteArrayTable(const QByteArray& data) { std::cout << "偏移\t十六进制\t二进制\t字符" << std::endl; std::cout << "-----------------------------------------" << std::endl; for (int i = 0; i < data.size(); ++i) { unsigned char byte = static_cast<unsigned char>(data[i]); // 生成两位补零的十六进制字符串 QString hexStr = QString::asprintf("0x%02X", byte); // 生成八位补零的二进制字符串 QString binStr = QString::number(byte, 2).rightJustified(8, '0'); // 处理字符显示:可打印字符直接输出,不可打印用'.'代替 QChar ch = static_cast<char>(byte); QString charStr = ch.isPrint() ? ch : QString('.'); // 输出表格行,每8个字节换行分隔 std::cout << QString("%1\t%2\t%3\t%4").arg(i, 4).arg(hexStr).arg(binStr).arg(charStr).toStdString() << std::endl; if ((i + 1) % 8 == 0 && i != data.size() - 1) { std::cout << "-----------------------------------------" << std::endl; } } } // 使用示例 int main() { QByteArray data = "Hello World"; printByteArrayTable(data); return 0; }
2. 关键工具函数说明
QString::asprintf("0x%02X", byte):直接格式化输出两位十六进制,自动补前导0,不管是空格(0x20)还是其他字符都能正确转换。QString::number(byte, 2).rightJustified(8, '0'):把字节转成二进制字符串后,自动补前导0到8位,保证格式整齐。ch.isPrint():Qt的QChar自带判断是否为可打印字符的方法,直接替代手动判断00-32的繁琐操作,不可打印字符统一用'.'显示。
3. 批量转十六进制的快捷方法
如果只需要把整个QByteArray转成连续的十六进制字符串,直接用QByteArray自带的toHex()方法:
QByteArray data = "Hello World"; QString hexTotal = data.toHex(' '); // 用空格分隔每个字节,输出示例:"48 65 6c 6c 6f 20 57 6f 72 6c 64" std::cout << hexTotal.toStdString() << std::endl;
内容的提问来源于stack exchange,提问作者Elisa Arcosti
相关产品推荐
相关产品推荐

