Как организовать или извлечь информацию из QByteArray

У меня есть программа, которая получает полный блок в одном QByteArray. Этот блок «разделен» с помощью «возврата каретки», за которым следуют «конечные строки» (\r\n). Посреди всего этого барахла у меня свидание. В частности, в третьей строке (между второй и третьей \r\n).

Каждый раз, когда я пытаюсь извлечь эту дату из ByteArray, я получаю случайный мусор. Как быть точнее с QByteArray?

Как лучше всего извлечь эту дату без изменения моего ByteArray? Учтите, что я не знаю дату, и она может быть даже в неправильном формате.

Просто для понимания вот пример моего ByteArray:

RandomName = имя \ r \ nRandomID = ID \ r \ nRandomDate = date \ r \ nRandomTime = время \ r \ nRandomWhatever = все (...)

РЕДАКТИРОВАТЬ:

Извините за плохой английский.

Допустим, мне прислали следующий текст:

ProgName = Marcus
ProgID = 180
ProgDate = 15.01.16
ProgTime = 13:39
(Подробнее) ......

Однако ни одна из этих сведений мне не полезна ... кроме даты. Все хранилось в одном массиве QByteArray (назовем его «ба»). Итак, это моя ба:

ProgName (пробел) = (пробел) Маркус \ r \ nProgID (пробел) = (пробел) 180 \ r \ nProgDate (пробел) = (пробел) 15.01.16 \ r \ nProgTime (пробел) = (пробел) 13: 39 \ г \ п (продолжает)

Моя проблема: сохранение «15.01.16» («ProgDate») в QString без изменения или уничтожения ba.


person andseg    schedule 16.08.2016    source источник
comment
Как вы конвертируете байты обратно в символы? Кажется, что все, что вам нужно сделать, это просканировать QByteArray на предмет индекса второго \ r \ n, получить индекс символа '=', затем скопировать каждый символ до следующей пары символов \ r \ n. ..   -  person user2647513    schedule 16.08.2016
comment
Вы все описываете как случайный мусор. Ваш ввод - случайный мусор, ваш вывод - случайный мусор, материал в середине - случайный мусор. Измените свой вопрос, чтобы показать, что вы пробовали, показать результат, который вы получаете, и показать результат, которого вы ожидаете.   -  person Barmak Shemirani    schedule 17.08.2016
comment
@ user2647513 Да, я попробовал сделать так, но в итоге получил неправильную часть ByteArray. Скорее всего, я неправильно использовал функцию   -  person andseg    schedule 17.08.2016
comment
@BarmakShemirani Мне очень жаль. Я постараюсь быть более ясным, когда буду редактировать   -  person andseg    schedule 17.08.2016


Ответы (1)


Есть множество способов, но попробуйте одно из следующих.

1) с помощью split ()

foreach (auto subByte, yourByteArray.replace("\r\n", "\n").split('\n')) {
    qDebug() << subByte;
    foreach (auto val, subByte.split('=')) {
        qDebug() << val;
    }
}

2) используя QRegularExpression / QRegularExpressionMatchIterator, делая всю пару (ключ, значение)

QRegularExpression  re("(\\w+)=(\\w+)");
QRegularExpressionMatchIterator i = re.globalMatch(yourByteArray);

while (i.hasNext()) {
    QRegularExpressionMatch match = i.next();
    qDebug() << match.captured(0)<< match.captured(1) << match.captured(2);
}

3) с использованием QRegularExpression / QRegularExpressionMatch

QRegularExpression  re("(RandomDate)=(\\w+)");
QRegularExpressionMatch match = re.match(yourByteArray);

if (match.hasMatch())
    qDebug() << match.captured(0)<< match.captured(1) << match.captured(2);
person Devopia    schedule 17.08.2016
comment
Хм, первый вариант мне понравился, но в основном потому, что его легче понять. Я попробую и доложу. Спасибо - person andseg; 17.08.2016