1

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

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

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

PS我在调试时在“本地和表达式”窗口中看到零

4

5 回答 5

2

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

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

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

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

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

QString field = textCodec->toUnicode(str, std::find(str, str + 10, '\0') - str).trimmed();
于 2015-03-07T11:26:43.567 回答
1

这对你有用吗?

#include <QDebug>
#include <QByteArray>

int main()
{
    char str[] = "STRING\0\0\0\0";
    auto ba = QByteArray::fromRawData(str, 10);

    qDebug() << ba.trimmed(); // does not work
    qDebug() << ba.simplified(); // does not work

    auto index = ba.indexOf('\0');
    if (index != -1)
        ba.truncate(index);
    qDebug() << ba;

    return 0;
}

使用fromRawData()可以节省额外的副本。确保str 在您删除ba.

indexOf()即使你已经填满了整个文件也是安全的,str因为 QByteArray你知道你只有 10 个字节可以安全地访问。它不会触及 11 号或更晚。没有缓冲区溢出。

删除 extra\0后,转换为QString.

于 2016-05-01T07:53:34.130 回答
0

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

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

然后你可以用remove()它来摆脱所有的空字节。注意:STRI\0\0\0\0NG也会导致STRING但你说这不会发生。

char *str = "STRING\0\0\0\0"; // that was read from file
QString field = QString::fromLocal8Bit(str, 10);
field.remove(QChar::Null);
于 2015-03-07T11:51:36.343 回答
0

我会这样做:

char* str = "STRING\0\0\0\0";
QByteArray fieldArr;

for(quint32 i = 0; i < 10; i++)
{
    if(str[i] != '\0')
    {
        fieldArr.append(str[i]);
    }
}
于 2015-03-07T11:35:04.643 回答
0

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

char * str = "STRING\0\0\0\0";                 // Assuming that was read from file
QString field(str);                            // field == "STRING\0\0\0\0"
field.truncate(field.indexOf(QChar::Null));    // field == "STRING" (without '\0' at the end)
于 2019-03-02T23:12:37.777 回答