365bet体育在线世界杯-365bet大陆-365手机安全卫士下载

— 怀旧经典 · 永恒记忆 —

【Qt】QByteArray详解

【Qt】QByteArray详解

QByteArray 是 Qt 框架中用于处理原始字节数据的核心类,其实质可以概括为以下几点:

1. 底层数据结构

• 连续内存块 :存储一段连续的字节数据(char*),类似 std::vector,但针对 Qt 框架做了优化。

• 自动内存管理 :内部自动分配和释放内存,无需手动管理。

• 隐式共享(写时复制) :使用 Implicit Sharing 技术,多个 QByteArray 对象共享同一份数据,直到修改时才进行深拷贝,以节省内存和计算资源。

2. 核心特性

• 二进制数据支持 :可存储任意二进制数据(如图片、音频、协议数据),不依赖字符编码。

• 与 C 字符串兼容 :数据默认以 \0 结尾,可通过 data() 或 constData() 直接获取 const char* 指针,方便与 C 函数交互。

• 动态大小 :支持动态扩容(如 append()、resize()),无需预分配固定大小。

3. 主要用途

• 网络通信 :序列化/反序列化数据(如通过 QNetworkRequest 发送二进制内容)。

• 文件 I/O :读写二进制文件(如 QFile::readAll() 返回 QByteArray)。

• 编码转换 :作为 QString 与编码(如 UTF-8、Latin-1)之间的桥梁(例如 QString::toUtf8() 返回 QByteArray)。

• 加密/哈希 :处理加密后的二进制结果(如 QCryptographicHash 的哈希值)。

4. 与 QString 的区别

特性

QByteArray

QString

数据本质

原始字节(char)

Unicode 字符(QChar,UTF-16)

编码感知

无(直接处理字节)

有(自动处理 Unicode 转换)

适用场景

二进制数据、协议、文件

文本处理、用户界面显示

C 字符串兼容性

直接兼容(data())

需转换(toUtf8())

5. 关键方法示例

cpp

复制代码

// 创建并初始化

QByteArray data("Hello"); // 内容: 'H' 'e' 'l' 'l' 'o' '\0'

// 追加数据

data.append(0x41); // 追加字节 0x41(ASCII 'A')

// 获取指针

const char* cstr = data.constData(); // 指向 "HelloA\0"

// 转换为十六进制字符串

QByteArray hex = data.toHex(); // "48656c6c6f41"

// 内存共享验证

QByteArray copy = data; // 隐式共享,不复制数据

copy[0] = 'h'; // 触发写时复制,data 和 copy 数据分离

6. 性能与注意事项

• 高效操作 :避免频繁调用 data() 获取指针,可能导致隐式共享分离。

• 二进制安全 :可包含 \0 字节,size() 返回实际数据长度(不包括结尾的 \0)。

• 编码转换 :与 QString 互转时需明确编码(如 fromUtf8()、toLatin1())。

常用接口 :

QByteArray::fromHex() 的输入参数类型是 QByteArray。

详细说明

• 函数签名:

cpp

复制代码

static QByteArray QByteArray::fromHex(const QByteArray &hexEncoded);

输入必须是一个 QByteArray 对象。

• 常见用法 :

• 直接传入 QByteArray:

cpp QByteArray hexData = "48656c6c6f"; // 十六进制字符串 QByteArray data = QByteArray::fromHex(hexData);

• 若使用 QString 作为输入,需先转换为 QByteArray(例如用 toLatin1() 或 toUtf8()):

cpp QString hexStr = "48656c6c6f"; QByteArray data = QByteArray::fromHex(hexStr.toLatin1());

参数要求

内容必须是有效的十六进制字符串 :

• 仅允许字符 0-9、a-f、A-F。

• 其他字符(如空格、g、x 等)会被自动忽略。

处理奇数字符长度 :

• 如果输入字符串长度为奇数,fromHex() 会自动在最前面补零 ,使其成为偶数长度。

• 例如:输入 "123" 会被当作 "0123" 解析。

示例

cpp

复制代码

// 示例1:直接使用 QByteArray

QByteArray hex1 = "31393231"; // 对应 "19121" 的十六进制

QByteArray a1 = QByteArray::fromHex(hex1);

// 结果: a1 = "19121", size = 5

// 示例2:使用 QString 转换

QString hexStr2 = "31393231";

QByteArray a2 = QByteArray::fromHex(hexStr2.toUtf8());

// 结果: a2 = "19121", size = 5

// 示例3:奇数字符长度

QByteArray hex3 = "abc"; // 奇数长度

QByteArray a3 = QByteArray::fromHex(hex3);

// 解析为 "0abc",结果: a3 = "\x0a\xbc"

常见错误

• 直接传递 QString:

cpp

复制代码

QString hexStr = "31393231";

QByteArray data = QByteArray::fromHex(hexStr); // 错误!类型不匹配

必须先将 QString 转换为 QByteArray(例如 hexStr.toLatin1())。

• 包含非十六进制字符:

cpp

复制代码

QByteArray hexData = "1g2h"; // 'g' 和 'h' 无效

QByteArray data = QByteArray::fromHex(hexData); // 自动忽略无效字符,解析为 "12"

QByteArray::fromHex() 的补零规则:

QByteArray a = QByteArray::fromHex(QString::toLatin1("19121")); 的 size 为 3。

详细步骤解析

输入字符串处理 :

• QString::toLatin1("19121") 将字符串 "19121" 转换为 Latin-1 编码的 QByteArray,其字节内容为 0x31 0x39 0x31 0x32 0x31(对应 ASCII 字符 '1' '9' '1' '2' '1')。

fromHex() 的转换规则 :

• fromHex() 将输入的字符串视为十六进制编码数据,每两个字符转换成一个字节 。

• 若输入长度为奇数,自动在最前面补零 使其成为偶数长度。

• 对于输入 "19121"(长度为 5,奇数):

◦ 补零后等效于 "019121"(长度为 6,偶数)。

◦ 分组为 "01"、"91"、"21"。

转换结果 :

• "01" → 0x01

• "91" → 0x91

• "21" → 0x21

• 最终 QByteArray a 包含 3 字节:[0x01, 0x91, 0x21],故 a.size() = 3。

验证代码

cpp

复制代码

QByteArray hexData = QString::toLatin1("19121"); // 内容: "19121" (5字节)

QByteArray a = QByteArray::fromHex(hexData);

qDebug() << a.size(); // 输出: 3

qDebug() << a.toHex(); // 输出: "019121"(实际存储的字节为 0x01 0x91 0x21)

关键点

• fromHex() 的输入必须是有效的十六进制字符(0-9、a-f、A-F),其他字符会被忽略。

• 补零规则确保奇数字符串能正确解析,避免数据截断。

相关推荐

365bet大陆 毛扫是什么

毛扫是什么

📅 08-13 👁️ 4449
365手机安全卫士下载 为什么自动加入了群聊呢

为什么自动加入了群聊呢

📅 08-31 👁️ 5172
365bet体育在线世界杯 眼圈熊简介 眼圈熊长什么样→MAIGOO百科

眼圈熊简介 眼圈熊长什么样→MAIGOO百科

📅 10-01 👁️ 8410
365bet大陆 付出和收获的经典语录(精选100句)

付出和收获的经典语录(精选100句)

📅 07-15 👁️ 7195
365手机安全卫士下载 谁说黑人不会踢球?非洲足坛最佳11人,拿世界杯冠军妥妥的

谁说黑人不会踢球?非洲足坛最佳11人,拿世界杯冠军妥妥的

📅 09-01 👁️ 2316
365bet大陆 chrome浏览器在同一网站同时登陆多账号

chrome浏览器在同一网站同时登陆多账号

📅 09-20 👁️ 1148
365bet体育在线世界杯 双头Type-C接口:解析充电方向的奥秘

双头Type-C接口:解析充电方向的奥秘

📅 09-06 👁️ 9642
365bet大陆 《魔物獵人世界 冰原》稀有生物捕捉指南

《魔物獵人世界 冰原》稀有生物捕捉指南

📅 08-25 👁️ 9826
365bet大陆 coc部落冲突天墉城全功能辅助开源

coc部落冲突天墉城全功能辅助开源

📅 09-27 👁️ 7419
365bet体育在线世界杯 2017冬天什麼時候來 2017年幾月份入冬

2017冬天什麼時候來 2017年幾月份入冬

📅 08-03 👁️ 1802
365手机安全卫士下载 庄子:好心就一定能办成好事吗?

庄子:好心就一定能办成好事吗?

📅 07-05 👁️ 5262