#include "Frame.h" #include "FieldCodec.h" namespace ccu { bool Frame::parseId(const std::vector& buf, uint16_t& outId) { if (buf.size() < FRAME_HEADER_LEN) return false; if (buf[0] != FRAME_START1 || buf[1] != FRAME_START2) return false; outId = FieldCodec::getU16(buf, 2); return true; } bool Frame::parseHeader(const std::vector& buf, FrameHeader& h) { if (buf.size() < FRAME_HEADER_LEN) return false; if (buf[0] != FRAME_START1 || buf[1] != FRAME_START2) return false; h.start1 = buf[0]; h.start2 = buf[1]; h.id = FieldCodec::getU16(buf, 2); h.length = FieldCodec::getU16(buf, 4); return true; } std::vector Frame::build( uint16_t id, const std::vector& payload, const ChecksumPolicy& checksum) { size_t csSize = checksum.size(); size_t total = FRAME_HEADER_LEN + payload.size() + csSize; std::vector frame(total, 0); frame[0] = FRAME_START1; frame[1] = FRAME_START2; FieldCodec::putU16(frame, 2, id); FieldCodec::putU16(frame, 4, static_cast(total)); // 域字节数=整个包长度 std::copy(payload.begin(), payload.end(), frame.begin() + FRAME_HEADER_LEN); if (csSize > 0) { // 校验和:对起始符到校验和之前所有字节求和 std::vector body(frame.begin(), frame.end() - csSize); uint32_t sum = checksum.compute(body); size_t off = frame.size() - csSize; if (csSize == 4) FieldCodec::putU32(frame, off, sum); else if (csSize == 1) frame[off] = static_cast(sum & 0xFF); else FieldCodec::putU16(frame, off, static_cast(sum)); } return frame; } } // namespace ccu