如何组织或从QByteArray中提取信息

时间:2016-08-16 20:49:36

标签: c++ qt qbytearray

我有一个程序,可以在单个QByteArray中收到一个完整的块。这个块是"划分"与'回车''接下来是'结束行' (\r\n)。在所有这些垃圾的中间,我有一个约会。最具体的是在第三行(第二行和第三行之间\r\n)。

每当我尝试从ByteArray中提取这个日期时,我最终会得到一些随机垃圾。如何更准确地使用QByteArray?

在不改变ByteArray的情况下提取此日期的最佳方法是什么?考虑到我不知道日期,甚至可能是错误的格式。

仅出于理解目的,这是我的ByteArray的一个例子:

  

RandomName =名\ r \ nRandomID = ID \ r \ nRandomDate = 日期 \ r \ nRandomTime =时间\ r \ nRandomWhatever =任何(...)

编辑:

抱歉英文不好。

我们说我发送了以下文字:

  

ProgName = Marcus
  ProgID = 180
  ProgDate = 15.01.16
  ProgTime = 13:39
  (更多信息)......

但是,除了日期之外,这些信息都不对我有用。一切都存储在一个QByteArray中(让我们称之为' ba')。所以这是我的ba:

  

PROGNAME(空间)=(空间)马库斯\ r \ nProgID(空间)=(空间)180 \ r \ nProgDate(空间)=(空间)16年1月15日\ r \ nProgTime(空间)=(空间)13 :39 \ r \ n(继续)

我的问题是:存储" 15.01.16" (" ProgDate")在QString中没有改变或破坏ba。

1 个答案:

答案 0 :(得分:2)

有多种方法,但请尝试以下解决方案之一。

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);