2017-01-20 2 views
0

QStringListQByteArray으로 변환하는 가장 효율적인 방법은 무엇입니까?Qt - QStringList to QByteArray

나는 비슷한 전환의 많은 예를 발견했지만, 필자가 필요로하거나 결코 불필요하게 너무 복잡한 예는 발견하지 못했습니다.


코드는 문자열 입력을 삭제 한 다음 QByteArray으로 변환합니다. 나는 후자와 고투하고있다.

void MainWindow::on_suicideButton_clicked() 
{ 
    QString input = ui->lineEdit->text(); 
    try{ 
     if(ui->lineEdit->text().contains("0x")||ui->lineEdit->text().contains(",")||ui->lineEdit->text().contains("-")) 
     { 
      input = input.replace("0x",""); 
      if (input.contains(',')) input = input.replace(",", ""); 
      // QString trim = input.trimmed(); 
      // input = trim;//.split(',', ' ', '-'); 
      QStringList inputArray = input.split('-'); 
      QByteArray output = inputArray; 
     } 
     //printf("%s\n", input); 

     ui->lineEdit->setText(input); 
    } 
    catch (const std::bad_alloc &) {input = " ";} 
} 

QStringList inputArray = input.split('-'); 중요하다 (또는 적어도 나는 그렇게 생각하는) 내가 그들에 다양한 작업을 수행하기 위해 별도의 조각으로 바이트를 분할해야하는 것처럼. 내가 제대로 이해한다면, 당신은 joinseparator로 문자열을해야합니다

char MainWindow::checkSum(QByteArray &b) 
{ 
    char val = 0x00; 
    char i; 
    foreach (i, b) 
    { 
     val ^= i; 
    } 

    return val; 
} 
+1

QArrayList은 무엇인가? QStringList를 의미합니까? – Jens

+0

QT 문서에서'QArrayList'에 대한 정보를 찾을 수 없습니다. – MRB

+0

축복, 그냥 내가 쓴 것을 깨달았다. :) –

답변

2

당신은 할 수에게이있을 수 있습니다 목록에있는 각 문자열에 QByteArray::append(const QString &str)을 적용하면됩니다. Docs은 자동으로 문자열을 변환 할 것이라고 말합니다 :

문자열 str을이 바이트 배열에 추가합니다. 유니 코드 데이터는 QString :: toUtf8()을 사용하여 을 8 비트 문자로 변환합니다.

그래서 당신은이 같은 작성할 수 있습니다

QByteArray output; 

// inputArray - your QStringList 
foreach (const QString &str, inputArray) 
{ 
    output.append(str); 
} 

을하지만 기본 대화를하지 않으려는 경우 같은 문서에 명시된대로 const char *로 변환 문자열을 추가 할 수 있습니다 :

응용 프로그램을 컴파일 할 때 QT_NO_CAST_TO_ASCII를 정의하여이 기능을 비활성화 할 수 있습니다. 그런 다음 을 const char *로 변환하려면 QString :: toUtf8() (또는 QString :: toLatin1() 또는 QString :: toLocal8Bit())을 명시 적으로 호출해야합니다.이 같은

그리고 무언가 :

output += str; 

이는 행동 것 :

output.append(str.toUtf8()); // or str.toLatin1() or str.toLocal8Bit() 

편집

1은 그냥 당신이 또한 += 대신 append()으로 사용할 수 있다는 것을 발견 append()과 같은 방식으로 라고 말하면서 here.

+0

그냥 문제로 돌아 왔고 귀하의 솔루션이 내 문제의 해결책이 될 수 있다고 생각하는 것에 가장 가깝다고 생각합니다. 그러나, 그 루프를 사용하면 바이트 배열에 chars 만 추가되고 배열은 바이트 당 단일 char을 포함하는 요소로 구성됩니다. '(A1-B2-C3-D4-E5'와 같은) 16 진수 문자열을 전달해야한다면 클러스터 전체를 유지해야합니다 (1 바이트는 A1, 다음 B2 등을 의미합니다). –

+0

@JoeCarr, 예, "A1"을 변환하면 각 문자가 개별적으로 변환됩니다. 그것을 함께 유지하려면 한 솔루션은 그대로 변환하고 매번 2 문자를 추출해야 마음에 계속 reconvert하는 것입니다. 또 다른 해결책은 2 개의 문자를 나타내는 것입니다. "A1"은 하나의 문자로, 예를 들어 십진수는 161입니다. ASCII 기호 ('unsigned char'사용)로 변환 한 다음 변환 할 수 있습니다. 이 방법을 사용하면 "A1"을 정확하게 나타낼 수 있지만 필요에 따라 다시 변환하는 것이 어려워집니다. –

2

: 여기


는 내가하고 싶은 작업의 종류를 참고하기 위해서는, 예입니다 당신의 선택의 다음 QStrings 인코딩에 따라 QByteArray로 변환 할 QString 기능 중 하나를 사용해야합니다

QStringList strlist; //Let's assume there's a value in there 

QChar separator = ''; //Any QChar or QString you want to use to separate the QStringList 
strlist.join(separator).toLocal8Bit(); //8 bit 
strlist.join(separator).toUtf8(); //UTF-8 
strlist.join(separator).toLatin1(); //Latin 
,

편집 1

if(input.contains("0x")||input.contains(",")||input.contains("-")) 
{ 
    //Just replace the chars you don't cant, then convert back to QByteArray 
    input = input.replace("0x",""); 
    input = input.replace(",", ""); 
    QStringList inputArray = input.Split('-'); 

    //Do what you want with your list 
    //... 

    //Converts it back 
    QByteArray output = inputArray.join('').toLocal8Bit(); 
} 

내가 지금 코드를 테스트 할 수 없습니다 QStringList

if(input.contains("0x")||input.contains(",")||input.contains("-")) 
{ 
    //Just replace the chars you don't cant, then convert back to QByteArray 
    input = input.replace("0x",""); 
    input = input.replace(",", ""); 
    input = input.replace("-", ""); 
    QByteArray output = input.toLocal8Bit(); 
} 

코드 편집 2에 맞게, 그래서 오타

+0

@ joe-carr 업데이트되었으므로 간단한 '대체'가 트릭을 수행 할 수있을 때 다시 분할 할 필요가 없습니다. –

+0

이제는 훨씬 더 깨끗하게 보입니다. 그러나 더 큰 기능의 기능은 입력을받는 것입니다. 문자열)을 사용하고 다른 기능을 수행하기 위해 16 진수로 변환합니다 (예 : 체크섬). 입력 (예 : 'A1-B2-C3-D4-E5'또는 '0xA1-0xB2-0xC3-0xD4-0xE5')을 가져 와서 QByteArray에 입력하면 입력 데이터를 조작하기가 훨씬 쉬워집니다. –

+0

@JoeCarr 제 1 편집은 이미 QByteArray를 제공합니다. 나는 네가 원하는 걸 알지 못한다. QByteArray 또는 QStringList를 조작 하시겠습니까? QByteArray 만 조작하려는 경우에는 QStringList –

1

문자열 목록을 직렬화하는 QDataStream은 어떻습니까?

// Fill the data buffer 
QByteArray data; 
QStringList list{"foo", "bar", "foobar"}; 
QDataStream dataStreamWrite(&data, QIODevice::WriteOnly); 
dataStreamWrite << list; 

// Do whatever you want with the raw data 

// And if you want to convert it back to a QStringList 
QDataStream dataStreamRead(data); 
QStringList list2; 
dataStreamRead >> list2; 
1

dydil이 답변 한대로 QDataStream을 사용할 수도 있습니다. 예를 들어

:

QByteArray serialize(QStringList data) 
{ 
    QByteArray byteArray; 
    QDataStream out(&byteArray, QIODevice::WriteOnly); 
    out << data; 
    return byteArray; 
} 

void deserialize(QByteArray byteArray, QStringList *data) 
{ 
    QDataStream in(&byteArray, QIODevice::ReadOnly); 
    in >> *data; 
}