1. 程式人生 > >QT中char變數與QString變數QByteArray變數區別

QT中char變數與QString變數QByteArray變數區別

轉載自http://blog.sina.com.cn/s/blog_539d078401014eoh.html

 

QByteArray可以用來儲存原始位元組(包括‘\0’)和傳統的8位‘\0'結束的字串。它比使用const char*更方便。

通常它能保證資料末尾是'\0'空字元。當要儲存二進位制的原始資料時或者減少記憶體佔用時,QByteArray特別合適。

 

除了QByteArray外,QT也用QString來儲存字串資料。QString儲存16位Unicode雙位元組字元,當要轉換成8位單位元組字元時可以用 QString::toAscii()函式 (或 

QString::toLatin1() 或 QString::toUtf8() 或QString::toLocal8Bit())。

 

一種初始化QByteArray變數的方法是簡單傳送一個 const char * 指標變數到建構函式. 例如下面的程式碼生成一個大小為5的包含字串"Hello"位元組陣列:

    QByteArray ba("Hello");

儘管陣列size()函式返回是5,但陣列包含一個額外的'\0'空字元。

 

QByteArray變數會進行const char *資料的深度拷貝。如果不需要深度拷貝,可以用函式

QByteArray::fromRawData()來替代。

 

函式char * QBygeArray::data()會返回儲存在byte陣列中的資料指標。指標可用於讀取或修改陣列中的位元組。資料總是以'\0'空字元結尾。位元組的數目將返回size()+1。

 

對於字元型陣列變數,如果賦值字串,字串結尾會置空字元。陣列的數目為字元數加1。字串的長度為字元數。例如:

char buffer[] = "Hello"

sizeof(buffer)=6

qstrlen(buffer)=5

 

QString tmp = "test";

QByteArray text = tmp.toLocal8Bit();
char *data = new char[text.size() + 1]
strcpy(data, text.data());

 

QByteArray text = QByteArray::fromHex("517420697320677265617421");
text.data();            // returns "Qt is great!"

 

A byte array created with fromRawData() is not null-terminated, unless the raw data contains a 0 character at position size.

static const char mydata[] = {

0x00, 0x00, 0x03, 0x84, 0x78, 0x9c, 0x3b, 0x76,
     0xec, 0x18, 0xc3, 0x31, 0x0a, 0xf1, 0xcc, 0x99,
     ...
     0x6d, 0x5b
};

QByteArray data = QByteArray::fromRawData(mydata, sizeof(mydata));
QDataStream in(&data, QIODevice::ReadOnly);
...

 

Hexadecimal to decimal conversion


QString str = "0xED8788DC";
bool ok;
uint appId = str.toUInt(&ok,16); //appId contains 3985082588

 

Decimal to hexadecimal conversion


uint decimal = 3985082588;
QString hexadecimal;
haxadecimal.setNum(decimal,16); //now hexadecimal contains ED8788DC
QString to char * conversion
QString str;
char * data=str.toLatin1().data();
QString to char * conversion
char * data;
QString str(data.toLatin1());