拆包--缓冲区查找包头及包尾偏移
生活随笔
收集整理的這篇文章主要介紹了
拆包--缓冲区查找包头及包尾偏移
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
緩沖區查找包頭及包尾偏移
- 前言
- 一、采用動態數組QByteArray的自帶函數
- 二、采用字節對比方法
- 測試代碼
前言
根據前面所講的內容封包拆包,當將網絡中的數據讀出存儲在自定義緩沖區QByteArray中,則對數據包進行拆分。則首先要進行的工作就是找到包頭的位置及包尾的位置,來判斷該包是否完整,下面就來講兩種方法來查找其偏移地址。
一、采用動態數組QByteArray的自帶函數
該方法主要就是采用QByteArray的indexOf(const QByteArray &, int)函數,buf表示緩沖區數據,data表示比較包頭或包尾的數據,Len表示包頭包尾長度。
int Find1(const QByteArray &buf, const char * data, int Len) {QByteArray array;array.append(data, Len);return buf.indexOf(array); }二、采用字節對比方法
該方法主要就是采用字節對比,buf表示緩沖區數據,data表示比較包頭或包尾的數據,Len表示包頭包尾長度。
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;}}} }測試代碼
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); ///創建包結構(模擬接收到網絡數據后的緩存區)HEAD head;TAIL tail;QFile file("test.dat"); //二進制文件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); //緩沖區數據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("數據獲取成功");}}else{qDebug()<<QString::fromLocal8Bit("數據丟失");}}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;}}} } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的拆包--缓冲区查找包头及包尾偏移的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 仿苹果涂鸦软件_这些iPhone自带软件
- 下一篇: linux邮件客户端软件,适用于Linu