拆包--缓冲区查找包头及包尾偏移
生活随笔
收集整理的這篇文章主要介紹了
拆包--缓冲区查找包头及包尾偏移
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
緩沖區(qū)查找包頭及包尾偏移
- 前言
- 一、采用動(dòng)態(tài)數(shù)組QByteArray的自帶函數(shù)
- 二、采用字節(jié)對(duì)比方法
- 測(cè)試代碼
前言
根據(jù)前面所講的內(nèi)容封包拆包,當(dāng)將網(wǎng)絡(luò)中的數(shù)據(jù)讀出存儲(chǔ)在自定義緩沖區(qū)QByteArray中,則對(duì)數(shù)據(jù)包進(jìn)行拆分。則首先要進(jìn)行的工作就是找到包頭的位置及包尾的位置,來判斷該包是否完整,下面就來講兩種方法來查找其偏移地址。
一、采用動(dòng)態(tài)數(shù)組QByteArray的自帶函數(shù)
該方法主要就是采用QByteArray的indexOf(const QByteArray &, int)函數(shù),buf表示緩沖區(qū)數(shù)據(jù),data表示比較包頭或包尾的數(shù)據(jù),Len表示包頭包尾長(zhǎng)度。
int Find1(const QByteArray &buf, const char * data, int Len) {QByteArray array;array.append(data, Len);return buf.indexOf(array); }二、采用字節(jié)對(duì)比方法
該方法主要就是采用字節(jié)對(duì)比,buf表示緩沖區(qū)數(shù)據(jù),data表示比較包頭或包尾的數(shù)據(jù),Len表示包頭包尾長(zhǎng)度。
int Find2(const QByteArray &buf, const char * data, int Len) {if (buf.size() < Len){return -1;}const char *temp = buf.data();for (int i = 0; i < buf.size()-Len+1; i++){for (int j = 0; j <= Len; j++){if (j == Len){return i;}if (*(temp+i+j) != *(data+j)){break;}}} }測(cè)試代碼
processor.h:
#pragma pack(1) #define PACK_HEAD 0xf1f2 #define PACK_TAIL 0xf2f3typedef struct {short dataHead;long long dataLen; }HEAD;typedef struct {short b;int c;long long d; }DATA;typedef struct {short daraTail; }TAIL;#pragma pack()main.cpp:
#include <QtCore/QCoreApplication> #include <QtDebug> #include <QFile> #include "processor.h"int Find1(const QByteArray &buf, const char *, int Len); int Find2(const QByteArray &buf, const char * data, int Len);int main(int argc, char *argv[]) {QCoreApplication a(argc, argv); ///創(chuàng)建包結(jié)構(gòu)(模擬接收到網(wǎng)絡(luò)數(shù)據(jù)后的緩存區(qū))HEAD head;TAIL tail;QFile file("test.dat"); //二進(jìn)制文件file.open(QIODevice::ReadOnly);char buf[2*1024];qint64 readLen = file.read(buf,sizeof(buf));head.dataLen = 1400; DATA *param = (DATA *)buf;head.dataHead = PACK_HEAD;tail.daraTail = PACK_TAIL;char *buf1 = new char[8*1024];memcpy(buf1,&head,sizeof(HEAD));memcpy(buf1+sizeof(HEAD),param,readLen);memcpy(buf1+sizeof(HEAD)+readLen,&tail,sizeof(TAIL));int len = sizeof(HEAD)+ readLen + sizeof(TAIL);QByteArray buffer;buffer.append(buf1, len); //緩沖區(qū)數(shù)據(jù)file.close(); if (buffer.size() > sizeof(HEAD)){int headOffset = Find2(buffer, (char *)&head, sizeof(head.dataHead));int tailOffset = Find2(buffer,(char *)&tail, sizeof(tail.daraTail));if (tailOffset-headOffset == len-sizeof(tail.daraTail)){QByteArray headTest= buffer.mid(headOffset,sizeof(HEAD)); //頭文件HEAD *packHead = (HEAD *)headTest.data();if (packHead->dataHead == head.dataHead){QByteArray dataTest = buffer.mid(headOffset+sizeof(HEAD),packHead->dataLen);DATA *packData = (DATA *)dataTest.data();qDebug()<<QString::fromLocal8Bit("數(shù)據(jù)獲取成功");}}else{qDebug()<<QString::fromLocal8Bit("數(shù)據(jù)丟失");}}return a.exec(); }int Find1(const QByteArray &buf, const char * data, int Len) {QByteArray array;array.append(data, Len);return buf.indexOf(array); }int Find2(const QByteArray &buf, const char * data, int Len) {if (buf.size() < Len){return -1;}const char *temp = buf.data();for (int i = 0; i < buf.size()-Len+1; i++){for (int j = 0; j <= Len; j++){if (j == Len){return i;}if (*(temp+i+j) != *(data+j)){break;}}} } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的拆包--缓冲区查找包头及包尾偏移的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 仿苹果涂鸦软件_这些iPhone自带软件
- 下一篇: 回溯求解排列组合(求源码评论区留言)