Qt 關于QString和std::string數據截斷的問題- 遇到\0或者0x00如何處理?
- 引言
- 一、解決方案
- 二、使用QByteArray注意事項
引言
在Qt開發中,使用QString或std::string獲取、發送字符串時,遇到\0
(空字符)或者0x00
(十六進制表示)可能導致數據截斷,因為其會將以上數據視為字符串終止符,導致后續數據被丟棄。
C 語言中字符串的結束標志\0:https://zhuanlan.zhihu.com/p/720768702
深入解析 C++ 中字符串的結尾標志\0
:https://blog.csdn.net/zy4213/article/details/141830309
一、解決方案
-
- 可以轉換為其他類型,比如
QByteArray
,可以正常處理\0
或0x00
。
- 可以轉換為其他類型,比如
-
- 調用或寫入設備時明確長度,比如使用QIODevice的write函數時,不要只傳遞數據,還要傳入其Size (如下所示,
推薦使用第一個和第三個函數
):
- 調用或寫入設備時明確長度,比如使用QIODevice的write函數時,不要只傳遞數據,還要傳入其Size (如下所示,
qint64 write(const char *data, qint64 len); // 推薦使用
qint64 write(const char *data); // 不建議使用此函數
inline qint64 write(const QByteArray &data) // 和第一個一樣
{ return write(data.constData(), data.size()); }
傳輸文件數據中存在多個 \0怎么避免截斷:https://blog.csdn.net/qq_49502822/article/details/145550671
Qt中執行write(data.constdata),在數組中“0x00”值處出現斷針【已解決】:https://blog.csdn.net/Taylor_0522/article/details/101343941
二、使用QByteArray注意事項
- 與
QByteArray
的互轉需要注意截斷
QbyteArray 包含 0x00 轉換為 QString 時數據被截斷:https://blog.csdn.net/wrs000001/article/details/125168561
- 調用函數傳參也要注意,比如以下例子,函數參數為QString,但傳入的是QByteArray (不會報錯,會自動轉換),QByteArray里包含0x00,自動轉為QString就會產生數據丟失。
void print_cs(QString s){qDebug() << s.toLatin1().toHex();
}
QByteArray cs;QDataStream ds(&cs, QIODevice::WriteOnly);ds << uint8_t(0x11);ds << uint8_t(0x22);ds << uint8_t(0x00);ds << uint8_t(0x33);qDebug() << cs.toHex();print_cs(cs);
- 輸出結果如下所示:
QString和QByteArray:https://blog.csdn.net/imred/article/details/104256932