You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt5:如何将QTextEdit的十六进制字符串转为fWrite所需参数?

解决变长十六进制字符串转二进制并写入fWrite的问题

我来帮你搞定这个需求!你需要把QTextEdit里的十六进制字符串转换成二进制字节数组,再传递给接收LPVOID和DWORD参数的fWrite函数对吧?用Qt自带的工具就能高效规范地实现,不用自己手写复杂的解析逻辑,下面一步步来:

步骤1:获取并预处理输入文本

首先从QTextEdit拿到用户输入的字符串,顺便做些预处理,让输入更灵活(比如允许用户用空格分隔十六进制字节,比如aa 00 11):

// 获取文本并去掉首尾空白
QString inputHex = ui->textDataToSend->toPlainText().trimmed();
// 移除所有空白字符(空格、制表符等),统一成连续的十六进制字符串
inputHex.remove(QRegExp("\\s+"));

步骤2:输入合法性校验

避免用户输入无效内容(比如长度奇数、包含非十六进制字符),提前做校验:

// 校验长度是否为偶数(每2个字符对应1个字节)
if (inputHex.length() % 2 != 0) {
    QMessageBox::warning(this, "输入错误", "十六进制字符串长度必须为偶数!");
    return;
}

// 校验是否全为合法十六进制字符(0-9, a-f, A-F)
QRegExp hexValidator("^[0-9a-fA-F]+$");
if (!hexValidator.exactMatch(inputHex)) {
    QMessageBox::warning(this, "输入错误", "输入包含非十六进制字符,请检查!");
    return;
}

步骤3:十六进制转二进制字节数组

Qt的QByteArray::fromHex()方法已经帮我们实现了高效的十六进制解析,直接调用即可:

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

比如输入"aa0011",sendData会包含3个字节:0xaa、0x00、0x11;输入"1122334455"则会生成5个字节的数组。

步骤4:调用fWrite函数

LPVOID本质就是void*,可以直接传递sendData.data()(QByteArray::data()返回char*,可隐式转换为LPVOID);dwBytesToWrite就是字节数组的长度sendData.size():

// 假设你的fWrite函数签名类似:BOOL fWrite(LPVOID lpBuffer, DWORD dwBytesToWrite, LPDWORD lpBytesWritten);
DWORD bytesWritten = 0;
BOOL writeResult = fWrite(sendData.data(), sendData.size(), &bytesWritten);

// 检查写入结果
if (!writeResult || bytesWritten != sendData.size()) {
    QMessageBox::warning(this, "写入失败", "数据未完全或成功写入,请检查!");
}

为什么这个方案高效规范?

  • 用Qt原生APIfromHex,经过官方优化,比自己手写解析逻辑(比如逐个字符转字节)更高效且不易出错;
  • 预处理和校验逻辑提升了用户体验,避免非法输入导致的程序异常;
  • 直接使用QByteArray管理内存,不需要手动分配释放,避免内存泄漏。

内容的提问来源于stack exchange,提问作者bLAZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:51:46