把不确定长度QString转换为20个字节的字符数组QByteArray,使用utf-8编码,如果字节数不够,高位字节补零
时间: 2024-02-23 21:00:47 浏览: 62
可以使用QByteArray的resize()方法将其长度调整为20,然后将不确定长度的QString转换为UTF-8编码的字节数组后,使用QByteArray的fill()方法将高位字节补零。
以下是示例代码:
```cpp
QString str = "你好,世界!";
QByteArray byteArray(20, 0); // 初始化为20个字节,全部为0
byteArray.resize(str.toUtf8().length()); // 调整长度为QString转换为UTF-8编码后的长度
// 将QString转换为UTF-8编码的字节数组
QByteArray utf8ByteArray = str.toUtf8();
for (int i = 0; i < utf8ByteArray.length(); i++) {
byteArray[i] = utf8ByteArray.at(i);
}
// 如果字节数不够,高位字节补零
if (byteArray.length() < 20) {
byteArray.fill(0, 20 - byteArray.length());
}
```
注意:上述代码假设QString中的字符都能够被转换为UTF-8编码的字节数组,如果包含无法转换的字符,可能会导致字节数组长度不够。
相关问题
C语言 去除QString 不符合UTF-8编码的内容
在C语言中,由于C标准库并不直接支持QString或Unicode编码的处理,你需要借助外部库,如Qt提供的API或者第三方的UTF-8工具库。以下是一个基本示例,展示如何使用Qt的QString API去除不符合UTF-8编码的内容:
```cpp
#include <QString>
#include <QByteArray>
#include <QTextCodec>
QString removeNonUtf8Characters(const QString &input) {
QByteArray utf8Bytes = input.toLocal8Bit();
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
if (!codec) {
qWarning("Unsupported encoding: UTF-8");
return QString();
}
QByteArray cleanUtf8 = codec->toUnicode(utf8Bytes).data();
// 检查是否有非法的UTF-8序列,如果有,跳过
for (int i = 0; i < cleanUtf8.size(); ++i) {
if (!codec->canEncode(cleanUtf8[i])) {
cleanUtf8.remove(i--, 1);
}
}
return QString::fromUtf8(cleanUtf8);
}
```
这段代码首先将QString转换为本地8位字节(QByteArray),然后尝试解码为UTF-8。接着检查每个字节是否能被UTF-8编码,如果不能就从数组中移除。最后,再将清理后的字节序列转换回QString。
int WorkThread::adb_shell_uart_test(QString temp) { QProcess process; QStringList args; args << "/c" << "adb shell"; process.start("cmd.exe",args); process.waitForStarted(); QString command1 = QString("stty -F /dev/tty%1 -echo\n").arg(temp); QString command2 = QString("cat dev/tty%1 &\n").arg(temp); QString command3 = QString("echo 1234 > dev/tty%1\r\n").arg(temp); QByteArray byteArray1 = command1.toUtf8(); // 将字符串编码为 UTF-8 格式的字节数组 QByteArray byteArray2 = command2.toUtf8(); QByteArray byteArray3 = command3.toUtf8(); process.write( byteArray1); process.write( byteArray2); process.write( byteArray3); process.waitForBytesWritten(); process.closeWriteChannel(); process.waitForFinished(5000); // 等待进程执行完毕 QString output = process.readAllStandardOutput(); qDebug() << "TEST:"; qDebug() << output; QString result = output.right(5); if(result == " 1234"){ return 0; }else{ return -1; } }
这段代码是一个在 Qt 中调用 adb 命令行工具执行串口测试的函数。具体实现如下:
1. 创建一个 `QProcess` 对象 `process`。
2. 创建一个 `QStringList` 对象 `args`,并向其添加两个参数:`/c` 和 `adb shell`。这两个参数会被传递给 `cmd.exe`,并告诉它执行 `adb shell` 命令。
3. 调用 `process.start()` 启动 `cmd.exe` 进程,并将 `args` 作为参数传递给它。这样就可以启动一个 adb shell 子进程。
4. 调用 `process.waitForStarted()` 等待子进程启动完成。
5. 构造三个命令字符串:`command1`、`command2` 和 `command3`,分别用于设置串口属性、启动串口监听和向串口发送数据。
6. 将命令字符串转换为 UTF-8 编码的字节数组,并通过 `process.write()` 向子进程输入这些命令。
7. 调用 `process.closeWriteChannel()` 关闭子进程的写通道。
8. 调用 `process.waitForFinished()` 等待子进程执行完毕,最多等待 5 秒。
9. 调用 `process.readAllStandardOutput()` 读取子进程的标准输出,并将其存储到 `output` 变量中。
10. 判断 `output` 中的最后五个字符是否为 " 1234",如果是,则返回 0,表示测试通过;否则返回 -1,表示测试失败。
需要注意的是,该函数中执行了一些 adb shell 命令,因此需要确保 adb 工具已经正确安装,并且在系统环境变量中设置了 adb 工具的路径。另外,该函数中使用了 `cmd.exe` 命令行解释器来启动 adb shell 子进程,因此该函数只能在 Windows 系统中运行。
阅读全文