繁体   English   中英

将char *转换为QString并删除零

[英]Convert char * to QString and remove zeros

在我的应用程序中,我从本地(不是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我在调试时在“本地和表达式”窗口中看到零

我将假定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();

我会这样做:

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

for(quint32 i = 0; i < 10; i++)
{
    if(str[i] != '\0')
    {
        fieldArr.append(str[i]);
    }
}

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

因为您不能保证存在终止的空字节,所以需要将长度手动设置为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);

这对您有用吗?

#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为止。

即使您已填满整个str indexOf()也是安全的,因为QByteArray知道只有10个字节可以安全访问。 它不会碰到11号或更高版本。 没有缓冲区溢出。

一旦删除了多余的\\0 ,就可以QString转换为QString

您可以在第一个\\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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM