[Qt] QByteArray, QByteArrayMatcher 

이번 글에서는 QByteArrayQByteArrayMatcher 사용법에 대해 알아보겠습니다.
QByteArray는 클래스 이름에서 보이듯이 바이트 배열에 대해 편의를 제공하는 클래스입니다.
1바이트 단위의 배열을 제공하며 보통 16진수 배열, 문자열을 다룰때 자주 사용됩니다.

QByteArray 선언

QByteArray를 선언할 땐 아래와 같이 선언 할 수 있습니다.

QByteArray ba1("Hello"); // "Hello" 문자열 초기화
QByteArray ba2(3, 'A'); // 사이즈 3설정. 사이즈만큼 'A' 문자로 초기화
QByteArray ba3(QByteArray::fromHex("686921")); // "hi!"의 Hex 표현

16진수로 이루어진 배열로 초기화 하고싶을 땐 QByteArray::fromHex 함수를 사용하여 초기화 할 수 있습니다.

QByteArray 멤버 함수

prependappend 함수를 사용하여 QByteArray 앞/뒤에 16진수 배열 데이터를 추가할 수 있습니다.

 ba1.prepend("Qt Programming "); // 앞에 추가
 ba1.append(" world!"); // 뒤에 추가

좌측, 우측, 중앙에 있는 값을 얻고 싶을땐 left, right, mid 함수를 사용하면 됩니다.

ba1.left(2); // 맨 앞 "Qt"
ba1.right(6); // 맨 뒤 "world!"
ba1.mid(3, 11); // 중앙 "Programming"

replace 함수를 사용하여 QByteArray의 특정 위치의 16진수 배열 데이터 값을 변경 할 수 있습니다.

ba2.replace(0, 3, "BBB"); // 0에서 길이3 만큼 BBB로 변경

isNullisEmpty 함수를 사용하여 QByteArray의 배열 상태를 확인 할 수 있습니다.
isNull과 isEmpty의 차이는 빈 문자열(“”)을 어떻게 체크하는 차이가 있습니다. isNull은 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

연산자 함수도 사용 가능합니다. 아래 예시는 == 연산자에 대한 예시입니다.

bool bSame = QByteArray("abc") == QByteArray("abc"); // 같음
bool bDiff = QByteArray("abc") == QByteArray("123"); // 다름

QByteArrayMatcher

QByteArrayMatcher를 사용하면 QByteArray에서 패턴을 찾을 수 있습니다.

 // QByteArrayMatcher 예시
 QByteArray baSearch("Hi! Qt Programming. Nice to meet you"); // 찾을 대상 문자열
 QByteArray baFind("Programming"); // 찾고자 하는 문자열
 QByteArrayMatcher matcher(baFind);

 int index = matcher.indexIn(baSearch, 0); // 문자열이 시작되는 위치
 QString strFind = baSearch.mid(index, baFind.length());

전체 코드는 아래와 같습니다.

#include <QCoreApplication>
#include <QByteArray>
#include <QByteArrayMatcher>

#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QByteArray ba1("Hello"); // "Hello" 문자열 초기화
    QByteArray ba2(3, 'A'); // 사이즈 3설정. 사이즈만큼 'A' 문자로 초기화
    QByteArray ba3(QByteArray::fromHex("686921")); // "hi!"의 Hex 표현

    qDebug() << ba1;
    qDebug() << ba2;
    qDebug() << ba3;
    qDebug() << "======================================================";

    ba1.prepend("Qt Programming "); // 앞에 추가
    qDebug() << ba1;
    ba1.append(" world!"); // 뒤에 추가
    qDebug() << ba1;
    qDebug() << "======================================================";

    qDebug() << ba1.left(2); // 맨 앞 "Qt"
    qDebug() << ba1.right(6); // 맨 뒤 "world!"
    qDebug() << ba1.mid(3, 11); // 중앙 "Programming"
    qDebug() << "======================================================";

    ba2.replace(0, 3, "BBB"); // 0에서 길이 3 만큼 BBB로 변경
    qDebug() << ba2;
    qDebug() << "======================================================";


    qDebug() << QByteArray().isNull();          // returns true
    qDebug() << QByteArray().isEmpty();         // returns true

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

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

    bool bSame = QByteArray("abc") == QByteArray("abc"); // 같음
    qDebug() << bSame;
    bool bDiff = QByteArray("abc") == QByteArray("123"); // 다름
    qDebug() << bDiff;
    qDebug() << "======================================================";


    // QByteArrayMatcher 예시
    QByteArray baSearch("Hi! Qt Programming. Nice to meet you"); // 찾을 대상 문자열
    QByteArray baFind("Programming"); // 찾고자 하는 문자열
    QByteArrayMatcher matcher(baFind);

    int index = matcher.indexIn(baSearch, 0); // 문자열이 시작되는 위치
    QString strFind = baSearch.mid(index, baFind.length());
    qDebug() << QString("index: %1, Find String: %2").arg(index).arg(strFind);
    qDebug() << "======================================================";


    return a.exec();
}

  • 참고
    • https://doc.qt.io/qt-6/qbytearray.html
    • https://doc.qt.io/qt-6/qbytearraymatcher.html