Files
capture/Parse.cpp
T
2024-10-28 15:33:11 +08:00

235 lines
6.1 KiB
C++

#include "Parse.h"
//解析线程
Parse::Parse(QObject *parent) : QObject(parent)
{
setAutoDelete(true);
qRegisterMetaType<QList<QByteArray>>("QList<QByteArray>");
qRegisterMetaType<QMap<quint16,QList<QByteArray>>>("QMap<quint16,QList<QByteArray>>");
qRegisterMetaType<QMap<quint32,QMap<quint16,QList<QByteArray>>>>("QMap<quint32,QMap<quint16,QList<QByteArray>>>");
Packer_init(&packer);
Parser_init(&parser);
datagram.clear();
}
Parse::~Parse()
{
}
void Parse::run()
{
uint64_t all = 0;
uint64_t current = 0;
QElapsedTimer time;
time.start();
qDebug() << "parse thread:" << QThread::currentThreadId();
union{uint8_t B[8];qint16 h[4];quint16 H[4]; qint32 i[2];quint32 I[2];qint64 q;quint64 Q;}src;
QByteArray header;
header[0] = 0x55;
header[1] = 0xAA;
all = datagram.size();
while (datagram.size() > 0) {
#if 0 //方法1
while (datagram.size() > 0) {
int index = datagram.indexOf(header);
if(index >= 0)
{
uint8_t id = datagram.at(index + 2);
uint32_t len = 0;
len = ((uint32_t)datagram.at(index + 3)) << 0;
len |= ((uint32_t)datagram.at(index + 4)) << 8;
len |= ((uint32_t)datagram.at(index + 5)) << 16;
len |= ((uint32_t)datagram.at(index + 6)) << 24;
uint8_t sum = 0;
QByteArray frame = datagram.mid(index + 7,len);
sum = std::accumulate(frame.begin(),frame.end(),0);
if(sum == datagram.at(index + 7 + len))
{
//ok
//qDebug() << "ok" << id << len << sum << datagram.size();
uint8_t raw_index = 16;
src.B[0] = frame.at(raw_index++);
src.B[1] = frame.at(raw_index++);
src.B[2] = frame.at(raw_index++);
src.B[3] = frame.at(raw_index++);
quint32 ip = src.I[0];
src.B[0] = frame.at(raw_index++);
src.B[1] = frame.at(raw_index++);
quint16 port =src.H[0];
current = all - datagram.size();
emit frameok(ip,port,frame);
emit progress(all,current);
}
datagram = datagram.mid(index + 7 + len + 1);
}
else
{
datagram.clear();
}
}
#else //方法2
for (QByteArray::const_iterator i = datagram.cbegin(); i != datagram.cend(); ++i)
{
current ++;
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;
*/
index += 16;
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]);
}
/*
if(port_data.contains(port))//包含
{
QList<QByteArray> frame_list = port_data.value(port);
frame_list.append(frame);
port_data.insert(port,frame_list);
}
else//不包含
{
QList<QByteArray> frame_list;
frame_list.append(frame);
port_data.insert(port,frame_list);
}
*/
frame_data.append(frame);//超限了
emit frameok(ip,port,frame);
//emit progress(all,current);
}
break;
default:{
}break;
}
}
#endif
emit frameList(frame_data);
emit frameport(port_data);
datagram.clear();
break;//退出,结束线程
}
qDebug() << "thread finished, time: " << time.nsecsElapsed()/1000000.0 << "ms";
}
//每次读取一个缓存大小的数据
void Parse::parseData(const QString filename)
{
qDebug() << "Parse data:" << QThread::currentThreadId();
if(filename.size() <= 0)
{
return;
}
QFile *file = new QFile(filename);
if(!file->open(QIODevice::ReadOnly))
{
delete file;
file = nullptr;
return;
}
frame_data.clear();
datagram.clear();
datagram.append(file->readAll());
}