Files
capture/Parse.cpp
T
2023-10-18 19:47:12 +08:00

138 lines
3.2 KiB
C++

#include "Parse.h"
Parse::Parse(QObject *parent) : QObject(parent)
{
setAutoDelete(true);
qRegisterMetaType<QList<QByteArray>>("QList<QByteArray>");
Packer_init(&packer);
Parser_init(&parser);
datagram.clear();
}
Parse::~Parse()
{
}
void Parse::run()
{
QElapsedTimer time;
time.start();
qDebug() << "parse thread:" << QThread::currentThreadId();
while (datagram.size() > 0) {
for (QByteArray::const_iterator i = datagram.cbegin(); i != datagram.cend(); ++i)
{
uint8_t id = -1;
switch (id = Parser_char(&parser,*i))
{
case 0x01:
{
union{uint8_t B[8];qint16 h[4];quint16 H[4]; qint32 i[2];quint32 I[2];qint64 q;quint64 Q;}src;
uint32_t index = 0;
src.B[0] = parser.buff[index++];
src.B[1] = parser.buff[index++];
src.B[2] = parser.buff[index++];
src.B[3] = parser.buff[index++];
src.B[4] = parser.buff[index++];
src.B[5] = parser.buff[index++];
src.B[6] = parser.buff[index++];
src.B[7] = parser.buff[index++];
qint64 time_t =src.Q;
QDateTime time = QDateTime::fromMSecsSinceEpoch(time_t);
src.B[0] = parser.buff[index++];
src.B[1] = parser.buff[index++];
src.B[2] = parser.buff[index++];
src.B[3] = parser.buff[index++];
src.B[4] = parser.buff[index++];
src.B[5] = parser.buff[index++];
src.B[6] = parser.buff[index++];
src.B[7] = parser.buff[index++];
qint64 save_count =src.Q;
src.B[0] = parser.buff[index++];
src.B[1] = parser.buff[index++];
src.B[2] = parser.buff[index++];
src.B[3] = parser.buff[index++];
quint32 ip = src.I[0];
src.B[0] = parser.buff[index++];
src.B[1] = parser.buff[index++];
quint16 port =src.H[0];
QByteArray frame;
frame.clear();
for(int i =0;i < parser.len;i++)
{
frame.append((const char)parser.buff[i]);
}
//qDebug() << time << save_count << QHostAddress(ip) << port;
FrameData.append(frame);
}
break;
default:
break;
}
}
emit frameList(FrameData);
datagram.clear();
break;//退出,结束线程
}
qDebug() << "thread finished, time: " << time.nsecsElapsed() << "ns";
}
void Parse::parseData(const QString filename)
{
qDebug() << "current thread is:" << QThread::currentThreadId();
if(filename.size() <= 0)
{
return;
}
QFile *file = new QFile(filename);
if(!file->open(QIODevice::ReadOnly))
{
delete file;
file = nullptr;
return;
}
FrameData.clear();
datagram.clear();
datagram.append(file->readAll());
}