将字符 * 转换为 QString 并删除零

Convert char * to QString and remove zeros

本文关键字:删除 QString 字符 转换      更新时间:2023-10-16

在我的应用程序中,我从本地(不是Unicode)字符集中的文件读取了一个字符串字段。该字段为 10 个字节,如果字符串<10 个字节,则余数用零填充。

char str ="STRING"; // that was read from file
QByteArray fieldArr(str,10); // fieldArr now is STRING00000000
fieldArr = fieldArr.trimmed() // from some reason array still containts zeros
QTextCodec *textCodec = QTextCodec::codecForLocale();
QString field = textCodec->ToUnicode(fieldArr).trimmed(); // also not removes zeros

所以我的问题 - 如何从字符串中删除尾随零?

附言调试时我在"局部和表达式"窗口中看到零

我将假设str应该是char const *而不是char

只是不要超过QByteArray - QTextCodec可以处理 C 字符串,它以第一个空字节结尾:

QString field = textCodec->toUnicode(str).trimmed();

附录:由于字符串可能不是以零结尾的,因此在末尾添加空字节的存储空间似乎是不可能的,并且制作副本以准备制作副本似乎很浪费,我建议自己计算长度并使用接受字符指针和长度的toUnicode重载。

std::find 对此有好处,因为如果在给定范围内找不到元素,它会返回给定范围的结束迭代器。这使得特殊情况处理变得不必要:

QString field = textCodec->toUnicode(str, std::find(str, str + 10, '') - str).trimmed();

QString可以使用fromLocal8Bit从char数组指针构造。选择编解码器的方式与在代码中手动选择的方式相同。

您需要手动将长度设置为 10,因为您说您不能保证存在终止空字节。

然后,您可以使用remove()来删除所有空字节。注意:STRING也会导致STRING但你说这不会发生。

char *str = "STRING"; // that was read from file
QString field = QString::fromLocal8Bit(str, 10);
field.remove(QChar::Null);

这对你有用吗?

#include <QDebug>
#include <QByteArray>
int main()
{
    char str[] = "STRING";
    auto ba = QByteArray::fromRawData(str, 10);
    qDebug() << ba.trimmed(); // does not work
    qDebug() << ba.simplified(); // does not work
    auto index = ba.indexOf('');
    if (index != -1)
        ba.truncate(index);
    qDebug() << ba;
    return 0;
}

使用 fromRawData() 可以节省额外的副本。 确保str一直存在,直到您删除ba

即使您已经填满了整个strindexOf()也是安全的 QByteArray知道您只有 10 个字节可以安全访问。 它不会碰 11 日或更晚。无缓冲区溢出。

删除额外的后,转换为QString是微不足道的。

您可以在第一个之后截断字符串:

char * str = "STRING";                 // Assuming that was read from file
QString field(str);                            // field == "STRING"
field.truncate(field.indexOf(QChar::Null));    // field == "STRING" (without '' at the end)

我会这样做:

char* str = "STRING";
QByteArray fieldArr;
for(quint32 i = 0; i < 10; i++)
{
    if(str[i] != '')
    {
        fieldArr.append(str[i]);
    }
}