2012年1月24日火曜日

( Qt C++ )QByteArrayについて


はい今回はQByteArrayについて書いていきます。

「コンテナクラスじゃないじゃん!」そう思った方、実は私もです。しかしC++ GUI Protramming with Qt4のcontainer classesの章によると「無関係じゃねぇし。QString,QByteArray,QVariantはここで説明すっから」と書かれています。ですので私もそれに従い書いていきます。

ということでQByteArrayをやっていきますが、これは簡単にいうと"バイト配列"です。必ず末尾に'\0'が格納されるという特徴があり、生のバイトや'\0'で終了する8ビット文字列などの格納や変換などに便利です。例えばQString から const char*への変換などに使えます。
リファレンス


C++ GUI Promming with Qt4にはこの後ほとんど説明が書かれていないのでリファレンスのサンプルを使います。
では用途別にコードを


(const char*のコンストラクタ)
QByteArray bytearray("Hello");
//"Hello"で'o'の次は'\0'となる。
//size()を呼び出すと5が返る


([ ]による代入)
QByteArray ba;
ba.resize(5);
ba[0] = 'A';
ba[1] = 0xb8;
ba[2] = 0x64;
ba[3] = 0x18;
ba[4] = 0xca;
//ちなみにba[5]には'\0'が入る


(前方挿入、後方追加、置換)
QByteArray x("and");

//前方挿入。 x == "rock and"
x.prepend("rock ");

//後方追加。 x == "rock and roll"
x.append(" roll");

//置換。位置[5]から3文字を'&'に置換 x == "rock & roll"
x.replace(5, 3, "&");


(文字列の検索)
QByteArray x("sticky question");
QByteArray y("sti");

//y = "sti"が見つかる最初のインデックスを返す
//この場合return 0
x.indexOf(y);

//y = "sti"が見つかる最初のインデックスを返す
//第2引数は開始位置
//この場合下二つはreturn 10
x.indexOf(y, 1);
x.indexOf(y, 10);

//位置[11]からは見つからないのでreturn -1となる
x.indexOf(y, 11);


(QByteArrayがNullかどうか、空かどうか)
QByteArray().isNull();          // returns true
QByteArray().isEmpty();         // returns true

QByteArray("").isNull();        // returns false
QByteArray("").isEmpty();       // returns true

QByteArray("abc").isNull();     // returns false
QByteArray("abc").isEmpty();    // returns false


(QByteArrayからQStringへ変換。 ※US-ASCII)
(QStringからQByteArrayへ変換。 ※US-ASCII)
QByteArray ba("ABC");

//QByteArrayからQStringへ変換
QString str = QString::fromAscii(ba);
//QStringからQByteArrayへ変換
QByteArray ba2 = str.toAscii();
※fromLatin1(),fromUtf8(),fromLocal8Bit()など、いろいろ用意されています。詳しくはリファレンスを参照してください。


その他QStringと同じようにleft(),right(),mid(),toLower(),toUpper(),trimmed(),simplified()なども使用できます。この辺りは前回の記事リファレンスを参照してください。

以上です。