2017-01-20 16 views
0

Что является наиболее эффективным способом преобразования QStringList в QByteArray?Qt - QStringList для 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('-'); важно (или, по крайней мере, я считаю, что это так), так как я должен был бы разделить байт на отдельные куски для того, чтобы выполнять различные операции над ними.


Вот пример, для того, чтобы увидеть, какие операции я хотел бы сделать:

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

    return val; 
} 
+1

Что такое QArrayList? Вы имеете в виду QStringList? – Jens

+0

Я не могу найти информацию о 'QArrayList' в документах QT. – MRB

+0

Благословите вас, только что поняли, что я написал. :) –

ответ

2

Вы можете просто примените QByteArray::append(const QString &str) для каждой строки в вашем списке. Docs говорит, что он автоматически преобразует строку:

Добавляет строку str в этот массив байтов. Данные Unicode равны , преобразованные в 8-разрядные символы с использованием QString :: toUtf8().

Таким образом, вы можете написать что-то вроде этого:

QByteArray output; 

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

Но если вы не хотите по умолчанию разговор можно добавлять строки, преобразованные в const char *, как указано в той же документации:

Вы можете отключить эту функцию, указав QT_NO_CAST_TO_ASCII, когда вы скомпилируете свои приложения . Затем вам нужно явно вызвать QString :: toUtf8() (или QString :: toLatin1() или QString :: toLocal8Bit()), если вы хотите, чтобы преобразовывал данные в const char *.

И сделать что-то вроде этого:

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

Edit 1

Просто обнаружил, что вы можете также использовать += вместо append():

output += str; 

Это ведут себя так же, как append() как указано here.

+0

Только что вернулся к проблеме, и я думаю, что ваше решение ближе всего к тому, что я считаю, что это может быть решением моей проблемы. Однако, используя этот цикл, только добавляет символы в массив байтов, ergo массив создается с элементами, содержащими один символ в байте. Если мне нужно передать шестнадцатеричную строку (например, «A1-B2-C3-D4-E5»), мне нужно было бы сохранить кластеры целиком (что означает, что один байт будет A1, следующий B2 и т. Д.). –

+0

@JoeCarr, Да, если вы конвертируете «A1», он будет конвертировать отдельно каждый символ. Чтобы сохранить это вместе, одно решение состоит в том, чтобы преобразовать его, а затем переконвертировать, имея в виду, что вам нужно извлекать 2 символа каждый раз. Другим решением является представление двух символов, например. «A1» как один символ, например, равен 161 в десятичном значении, поэтому вы можете представить его как символ ASCII (используйте «unsigned char»), а затем преобразуйте его. Таким образом, у вас будет точное представление «A1», но было бы немного сложнее переконвертировать назад в зависимости от того, что вам нужно. –

2

Если я правильно понимаю, вы должны join струны separator по вашему выбору, то придется использовать один из QString функций для преобразования в QByteArray в зависимости от QStrings кодирования

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 

Edit 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(",", ""); 
    input = input.replace("-", ""); 
    QByteArray output = input.toLocal8Bit(); 
} 

Edit 2 с 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(",", ""); 
    QStringList inputArray = input.Split('-'); 

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

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

Я не могу проверить код прямо сейчас, так что может быть опечатка

+0

@ joe-carr Обновлено, не нужно было делиться, а потом присоединиться, когда простая «замена» может привести к трюку –

+0

Да, теперь он выглядит намного чище, однако функция большей функции заключается в том, чтобы взять вход (который строка) и преобразовать его в шестнадцатеричный, чтобы на нем выполнялись другие функции (например, контрольная сумма). Наличие ввода (например, «A1-B2-C3-D4-E5», или «0xA1-0xB2-0xC3-0xD4-0xE5») и заполнение его в QByteArray значительно облегчило бы манипулирование входными данными. –

+0

@JoeCarr Мое первое редактирование уже дает вам 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

Как ответил Дидиль, вы можете использовать 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; 
}