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

行き過ぎないでください-C文字列を処理でき、最初のヌルバイトで終わりますQByteArray:QTextCodec

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

補遺:文字列がゼロ終端されていない可能性があるため、null バイトのストレージを末尾に追加することは不可能に思え、コピーを作成する準備のためにコピーを作成するのは無駄に思えます。自分で長さを計算し、toUnicodeオーバーロードを使用することをお勧めします。 char ポインターと長さを受け入れます。

std::find要素が見つからない場合、指定された範囲の終了イテレータを返すため、これには適しています。これにより、特別なケースの処理が不要になります。

QString field = textCodec->toUnicode(str, std::find(str, str + 10, '\0') - str).trimmed();
于 2015-03-07T11:26:43.567 に答える
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

QStringfromLocal8Bitを使用して char 配列ポインタから構築できます。コーデックは、コードで手動で行うのと同じ方法で選択されます。

終端のヌルバイトが存在するという保証はないと言うので、長さを手動で 10 に設定する必要があります。

次にremove()、すべての null バイトを取り除くために使用できます。注意: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 に答える