QString转16进制数组

这篇文章介绍了如何使用C++编写一个名为QString2Hex的函数,该函数接受一个QString作为输入,通过正则表达式验证并将其转换为十六进制字节数组,同时确保输入的十六进制字符串有效且长度为偶数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <QRegularExpression>
#include <iostream>
int QString2Hex(QString& text, char* buf)
{
    // 使用正则表达式验证输入是否是有效的十六进制字符串
    QRegularExpression hexRegex("^[0-9A-Fa-f]+$");
    QRegularExpressionMatch match = hexRegex.match(text);
    bool isValidHex = match.hasMatch();

    if (!isValidHex) {
        std::cout << "输入的文本不是有效的十六进制字符串" << std::endl;
        return 0;
    }

    // 确保字符串长度是偶数
    if (text.length() % 2 != 0) {
        std::cout << "十六进制字符串的长度应该是偶数" << std::endl;
        return 0;
    }

    // 将十六进制字符串转换为字节数组
    QByteArray byteArray = QByteArray::fromHex(text.toUtf8());

    // 将QByteArray中的数据复制到char数组中
    memcpy(buf, byteArray.constData(), byteArray.size());

    // 现在buf中存储的就是转换后的十六进制数据
    // 例如,如果用户输入了"11020ABB",buf将是 {0x11, 0x02, 0x0A, 0xBB}
    // 打印buf的内容以验证
    for (int i = 0; i < byteArray.size(); ++i) {
        std::cout << "buf[" << i << "] = 0x" << std::hex << (int)((unsigned char)buf[i]) << std::endl;
    }

    return byteArray.size();
}
Qt中的字符串换为16进制数组是一个常见的需求,特别是在处理二进制数据、网络通信或文件读写时。下面我会详细介绍如何使用Qt库完成这一操作。 ### 使用QString和QByteArray 假设我们有一个`QString`类型的字符,并想将其换成对应的十六进制表示形式存储在一个字节数组里: #### 示例代码 ```cpp #include <QString> #include <QByteArray> #include <QDebug> // 定义函数:QString 换到 十六进制 QByteArray QByteArray stringToHex(const QString& str) { // 首先把 QString 编码为Latin1编码的字节流(可以根据需要选择其他编码) QByteArray byteArray = str.toLatin1(); // 创建一个新的 QByteArray 来存放最终的结果 QByteArray hexArray; for (const char &byte : byteArray) { // 把每个字节都换为两位长度的十六进制数并追加至结果集中 hexArray.append(QString("%1").arg(static_cast<unsigned char>(byte), 2, 16, QChar('0')).toUtf8()); } return hexArray; } int main() { QString inputStr = "HelloWorld"; QByteArray result = stringToHex(inputStr); qDebug() << "原始字符串:" << inputStr; qDebug() << "换后的16进制数组:" << result.data(); return 0; } ``` 此段程序首先会获取给定字符串的 Latin1 编码版本,然后逐个遍历每一个字节,将其化为两个数字组成的16进制值,并依次添加到新的 `QByteArray` 对象中去。 请注意,在实际应用当中你需要根据具体情况调整编码方式(`toLatin1()` 可替换为如 `toUtf8()`)以及是否需要前导零等细节内容。 ### 输出示例: 如果输入字符串是 `"Hello"` ,则输出将是类似于 `48656c6c6f` 的连续字符序列,代表了原ASCII文本"Hello"各个字母对应的16进制数值。 此外还有另一种更简便的做法可以直接通过`QByteArray::toHex()` 函数直接对已有的 byte array 进行快速化: ```cpp QByteArray ba = "Hello".toLocal8Bit().toHex(); qDebug()<<ba; // prints "48656c6c6f" ``` 这种方法更为简洁明了,适用于大多数场景下不需要额外自定义格式化规则的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值