#include "Communicate.h" constexpr unsigned char gHeader[] = {0xFF, 0xFE}; constexpr unsigned char gTail[] = {0xFF, 0xFF}; Communicate::Communicate() { } /* 【 transm TCP 数据协议 】 header 2 char: 0xFF 0xFE from 32 char: to 32 char: len 4 char: data xxxxx: tail 2 char: 0xFF 0xFF */ FrameBuffer* Communicate::ParseBuffer(MutBuffer& buffer) { FrameBuffer* frame = nullptr; int find = buffer.IndexOf((const char*)gHeader, sizeof(gHeader)); if (find < 0) { return frame; } int len = 0; std::memcpy(&len, buffer.GetData() + find + sizeof(gHeader) + 64, sizeof(len)); if (buffer.Length() < (find + sizeof(gHeader) + 64 + len + sizeof(len) + sizeof(gTail)) || len < 0) { return frame; } if (std::memcmp(buffer.GetData() + find + sizeof(gHeader) + 64 + sizeof(len) + len, gTail, sizeof(gTail)) != 0) { return frame; } frame = new FrameBuffer(); frame->fid = std::string(buffer.GetData() + find + sizeof(gHeader), 32); frame->tid = std::string(buffer.GetData() + find + sizeof(gHeader) + 32, 32); if (len > 0) { frame->data = new char[len]; std::memcpy(frame->data, buffer.GetData() + find + sizeof(gHeader) + 64 + sizeof(len), len); frame->len = len; } buffer.RemoveOf(0, find + sizeof(gHeader) + 64 + len + sizeof(len) + sizeof(gTail)); return frame; } bool Communicate::PackBuffer(FrameBuffer* frame, char** buf, int& len) { if (frame == nullptr) { return false; } if (frame->data == nullptr) { frame->len = 0; } len = sizeof(gHeader) + 64 + sizeof(len) + frame->len + sizeof(gTail); *buf = new char[len]; std::memcpy(*buf, gHeader, sizeof(gHeader)); std::memcpy(*buf + sizeof(gHeader), frame->fid.c_str(), 32); std::memcpy(*buf + sizeof(gHeader) + 32, frame->tid.c_str(), 32); std::memcpy(*buf + sizeof(gHeader) + 64, &frame->len, sizeof(len)); if (frame->len > 0) { std::memcpy(*buf + sizeof(gHeader) + 64 + sizeof(len), frame->data, frame->len); } std::memcpy(*buf + sizeof(gHeader) + 64 + sizeof(len) + frame->len, gTail, sizeof(gTail)); return true; } FrameBuffer::~FrameBuffer() { delete[] data; len = 0; }