在Qt下寫串口字符串讀寫方面的程序,裏面需要處理一些QString和字符數組等方面的字符處理。
QString:
QString類提供Unicode字符串。
QString存儲一個16位QChars字符串,其中每個QChar對應一個Unicode 4.0字符。(代碼值大於65535的Unicode字符使用代理項對(即兩個連續的QChars)存儲。)
Unicode是一個國際標準,它支持目前使用的大多數書寫系統。它是US-ASCII(ANSI X3.4-1986)和Latin-1(ISO 8859-1)的超集,所有US-ASCII/Latin-1字符都位於相同的代碼位置。
在幕後,QString使用隱式共享(寫時複製)來減少內存使用並避免不必要的數據複製。這也有助於減少存儲16位字符而不是8位字符的固有開銷。
除了QString,Qt還提供QByteArray類來存儲原始字節和傳統的以8位“\0”結尾的字符串。在大多數情況下,QString是您要使用的類。它在整個Qt API中使用,Unicode支持確保瞭如果您希望在某個時候擴展應用程序的市場,應用程序將易於翻譯。QByteArray適用的兩種主要情況是需要存儲原始二進制數據時,以及內存保護非常重要時(如在嵌入式系統中)。
QString str = "Hello";
QString str;
str.resize(4);
str[0] = QChar('U');
str[1] = QChar('n');
str[2] = QChar(0x10e3);
str[3] = QChar(0x03a3);
QByteArray:
QByteArray類提供字節數組。
QByteArray可用於存儲原始字節(包括“\0”)和傳統的以8位“\0”結尾的字符串。使用QByteArray比使用const char*方便得多。在後臺,它總是確保數據後面跟着一個“\0”終止符,並使用隱式共享(寫時複製)來減少內存使用並避免不必要的數據複製。
除了QByteArray,Qt還提供QString類來存儲字符串數據。在大多數情況下,QString是您要使用的類。它存儲16位Unicode字符,使您可以輕鬆地在應用程序中存儲非ASCII/非拉丁-1字符。此外,QString在Qt API中貫穿始終。QByteArray適用的兩種主要情況是需要存儲原始二進制數據時,以及內存保護非常重要時(例如,對於嵌入式Linux,使用Qt)。
例如:
QByteArray ba("Hello");
QByteArray ba;
ba.resize(5);
ba[0] = 0x3c;
ba[1] = 0xb8;
ba[2] = 0x64;
ba[3] = 0x18;
ba[4] = 0xca;
那麼兩者之間的轉換呢?
以下的方法都是從網上搜索和幫助文檔中獲得;
//常用參數類型:char *字符串, QByteArray字符數組, QString字符串
//需要轉換:char * ---轉--- QByteArray ---需要調用QByteArray類的構造函數
char* --------------QByteArray(const char*)-----------> QByteArray
char* str;
QByteArray byte(str);
char* --------------QString(const char*)-------------->QString
char* str;
QString string(str);
QByteArray -------------data()-------------------->char*
QByteArray byte;
char* str = byte.data();
QByteArray ------------QString()------------------->QString
QByteArray byte;
QString string(byte);
QString --------------toAscii()--------------------> QByteArray
QString string;
QByteArray byte = string.toAscii();
QString -------------qPrintable()------------------>char*
QString string;
char* str = qPrintable(string);
例如項目中使用的:
char *msg; QString Buffer = "ab-cd-ef-gh"; unsigned char BufAddr[9]; QByteArray ba = Buffer .toLatin1(); msg = ba.data(); int i=0; while (*msg) { if(*msg != '-') { BufAddr[i] = *msg; i++; ++msg; } else { ++msg; } }
其中:toLatin1、toLocal8Bit都是QString轉QByteArray的方法,Latin1代表ASCII,Local8Bit代表unicode。