Files
front_linux/LFtid1056/PQSMsg.h

2065 lines
63 KiB
C
Raw Normal View History

2025-06-13 11:29:59 +08:00
#include <vector>
#include <cstdint>
#include <cstring>
#include <string>
#include <stdexcept>
#include <algorithm>
#include <cctype>
#include <cstdlib>
#include <ctime>
#include <arpa/inet.h> // <20>ֽ<EFBFBD><D6BD><EFBFBD>ת<EFBFBD><D7AA>
#include <array>
#include <cmath>
using namespace std;
float IntToFloat(int num);
float ShorToFloat100(short num);
float ShorToFloat1000(short num);
float ShorToFloat10000(short num);
// <20><><EFBFBD>ͱ<EFBFBD><CDB1>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><C3B6>
enum class MsgRequestType : unsigned char {
//ѯ<><D1AF>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
Request_StatTime = 0x8b,
//ѯ<><D1AF>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-07-09 10:03:37 +08:00
Request_Stat = 0x8a,
//ѯ<><D1AF>ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD>
Request_New_3S = 0x04,
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>ļ<EFBFBD>
Request_File_Download = 0x07
};
// <20><><EFBFBD>ձ<EFBFBD><D5B1>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD><C3B6>
enum class MsgResponseType : unsigned char {
//ѯ<><D1AF>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
Response_StatTime = 0x27,
//ѯ<><D1AF>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-07-09 10:03:37 +08:00
Response_Stat = 0x26,
//ѯ<><D1AF>ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD>
Response_New_3S = 0x84,
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD><CDB5><EFBFBD>̬<EFBFBD>¼<EFBFBD>
Response_Event = 0x16,
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͵IJ<CDB5><C4B2><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ϣ<EFBFBD>¼<EFBFBD>
Response_ActiveSOEInfo = 0x17,
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>ļ<EFBFBD>
Response_File_Download = 0x87
};
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>
class MessageParser {
public:
// <20><>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>
uint8_t msgType; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::vector<uint8_t> RecvData; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int nMsgLen; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><D6A1><EFBFBD><EFBFBD>+<2B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int nRecvDataLen; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5B3A4>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD>bool<6F><6C><EFBFBD><EFBFBD>
bool SetMsg(const uint8_t* udata, size_t data_size) {
// 1. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
if (udata == nullptr) {
return false; // <20><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD>ʧ<EFBFBD><CAA7>
}
// 2. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD>ȣ<EFBFBD>6<EFBFBD>ֽ<EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>
constexpr size_t MIN_HEADER_SIZE = 6;
if (data_size < MIN_HEADER_SIZE) {
return false; // ͷ<><CDB7><EFBFBD><EFBFBD><EFBFBD>Ȳ<EFBFBD><C8B2><EFBFBD>
}
// 3. <20><>ȡ<EFBFBD><C8A1><EFBFBD>ij<EFBFBD><C4B3>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
nMsgLen = (static_cast<uint16_t>(udata[4]) << 8) | udata[5];
// 4. <20><>֤<EFBFBD><D6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD> (8 + nMsgLen)
if (data_size < 8 + nMsgLen) {
return false; // <20><><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD>
}
// 5. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ɾ<><C9BE><EFBFBD>˹<EFBFBD><CBB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>4<EFBFBD>ֽ<EFBFBD>
nRecvDataLen = nMsgLen - 4;
// 6. CRCУ<43><EFBFBD><E9A3A8><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD>Ҫʵ<D2AA>֣<EFBFBD>
/*
if (!ValidateCRC(udata, 8 + nMsgLen)) {
return false; // CRCУ<43><D0A3>ʧ<EFBFBD><CAA7>
}
*/
// 7. <20><>ȡ<EFBFBD><C8A1>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB> 6 + 2 = 8)
msgType = udata[8];
// 8. <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>12<31><32>ʼ)
RecvData.clear();
if (nRecvDataLen > 0) {
// ȷ<><C8B7><EFBFBD><EFBFBD>Խ<EFBFBD>磨nRecvDataLen = nMsgLen - 4<><34>
RecvData.assign(udata + 12, udata + 12 + nRecvDataLen);
}
return true; // <20><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD>ɹ<EFBFBD>
}
};
//<2F><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
class tagTime {
public:
uint16_t DeviceYear;
uint16_t DeviceMonth;
uint16_t DeviceDay;
uint16_t DeviceHour;
uint16_t DeviceMinute;
uint16_t DeviceSecond;
// <20><><EFBFBD>ؽṹ<D8BD><E1B9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƴ<EFBFBD>С
static constexpr size_t GetSize() {
return 6 * sizeof(uint16_t);
}
// Ĭ<>Ϲ<EFBFBD><CFB9><EFBFBD><ECBAAF>
tagTime() :
DeviceYear(1970),
DeviceMonth(1),
DeviceDay(1),
DeviceHour(0),
DeviceMinute(0),
DeviceSecond(0) {}
// <20><>std::tm<74><6D><EFBFBD><EFBFBD>
explicit tagTime(const std::tm& dt) :
DeviceYear(static_cast<uint16_t>(dt.tm_year + 1900)),
DeviceMonth(static_cast<uint16_t>(dt.tm_mon + 1)),
DeviceDay(static_cast<uint16_t>(dt.tm_mday)),
DeviceHour(static_cast<uint16_t>(dt.tm_hour)),
DeviceMinute(static_cast<uint16_t>(dt.tm_min)),
DeviceSecond(static_cast<uint16_t>(dt.tm_sec)) {}
// <20><><EFBFBD>ƺ<EFBFBD><C6BA><EFBFBD>
void Clone(const tagTime& src) {
DeviceYear = src.DeviceYear;
DeviceMonth = src.DeviceMonth;
DeviceDay = src.DeviceDay;
DeviceHour = src.DeviceHour;
DeviceMinute = src.DeviceMinute;
DeviceSecond = src.DeviceSecond;
}
// <20>Ӷ<EFBFBD><D3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
bool SetStructBuf(const uint8_t* bArray, size_t bufSize, size_t offset = 0) {
if (bufSize - offset < GetSize()) {
return false;
}
const uint8_t* ptr = bArray + offset;
DeviceYear = ntohs(*reinterpret_cast<const uint16_t*>(ptr));
ptr += sizeof(uint16_t);
DeviceMonth = ntohs(*reinterpret_cast<const uint16_t*>(ptr));
ptr += sizeof(uint16_t);
DeviceDay = ntohs(*reinterpret_cast<const uint16_t*>(ptr));
ptr += sizeof(uint16_t);
DeviceHour = ntohs(*reinterpret_cast<const uint16_t*>(ptr));
ptr += sizeof(uint16_t);
DeviceMinute = ntohs(*reinterpret_cast<const uint16_t*>(ptr));
ptr += sizeof(uint16_t);
DeviceSecond = ntohs(*reinterpret_cast<const uint16_t*>(ptr));
return true;
}
// <20><><EFBFBD>л<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
size_t GetStructBuf(uint8_t* bArray, size_t bufSize, size_t offset = 0) const {
if (bufSize - offset < GetSize()) {
return 0;
}
uint8_t* ptr = bArray + offset;
*reinterpret_cast<uint16_t*>(ptr) = htons(DeviceYear);
ptr += sizeof(uint16_t);
*reinterpret_cast<uint16_t*>(ptr) = htons(DeviceMonth);
ptr += sizeof(uint16_t);
*reinterpret_cast<uint16_t*>(ptr) = htons(DeviceDay);
ptr += sizeof(uint16_t);
*reinterpret_cast<uint16_t*>(ptr) = htons(DeviceHour);
ptr += sizeof(uint16_t);
*reinterpret_cast<uint16_t*>(ptr) = htons(DeviceMinute);
ptr += sizeof(uint16_t);
*reinterpret_cast<uint16_t*>(ptr) = htons(DeviceSecond);
return GetSize();
}
};
//г<><D0B3><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD> Ĭ<><C4AC>50
constexpr int HARMNUM = 50;
// <20><>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD>ݽṹ
struct tagInHarmData {
int32_t Val;
int32_t f;
static constexpr size_t GetSize() {
return sizeof(Val) + sizeof(f);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool SetStructBuf(const uint8_t* ptr) {
Val = ntohl(*reinterpret_cast<const int32_t*>(ptr));
ptr += sizeof(int32_t);
f = ntohl(*reinterpret_cast<const int32_t*>(ptr));
return true;
}
};
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽṹ
struct tagPowerData {
int32_t P;
int32_t Q;
int32_t S;
static constexpr size_t GetSize() {
return sizeof(P) + sizeof(Q) + sizeof(S);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool SetStructBuf(const uint8_t* ptr) {
P = ntohl(*reinterpret_cast<const int32_t*>(ptr));
ptr += sizeof(int32_t);
Q = ntohl(*reinterpret_cast<const int32_t*>(ptr));
ptr += sizeof(int32_t);
S = ntohl(*reinterpret_cast<const int32_t*>(ptr));
return true;
}
};
// <20><><EFBFBD><EFBFBD><EFBFBD>ݽṹ (ʹ<><CAB9>1<EFBFBD>ֽڶ<D6BD><DAB6><EFBFBD>)
#pragma pack(push, 1)
class tagPqData {
public:
int16_t name; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int16_t Data_Type; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tagTime time; // ʱ<><CAB1>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<int32_t, 9> Rms; // <20><>ѹ/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Чֵ
std::array<int32_t, 6> UU_Deviation; // <20><>ѹ<EFBFBD><D1B9>ƫ<EFBFBD><C6AB>
std::array<int32_t, 6> UL_Deviation; // <20><>ѹ<EFBFBD><D1B9>ƫ<EFBFBD><C6AB>
std::array<int32_t, 2> F_Deviation; // Ƶ<><C6B5>ƫ<EFBFBD><C6AB>
std::array<std::array<int32_t, 4>, 2> UI_Seq; // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<std::array<int32_t, HARMNUM>, 6> FuHarm; // <20><><EFBFBD><EFBFBD>г<EFBFBD><D0B3>
std::array<std::array<int32_t, HARMNUM>, 6> FuHarmPhase; // г<><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<std::array<tagInHarmData, HARMNUM>, 6> InHarm; // <20><>г<EFBFBD><D0B3>
std::array<std::array<int32_t, 3>, 4> Total_Power; // <20>ܹ<EFBFBD><DCB9><EFBFBD>
std::array<std::array<tagPowerData, HARMNUM>, 4> Harm_Power; // г<><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<std::array<int16_t, HARMNUM>, 6> Harm_Contain; // г<><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<int16_t, 6> Harm_Aberrance; // г<><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<int16_t, 4> Cos_PF; // <20><><EFBFBD>ڹ<EFBFBD><DAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<int16_t, 4> Cos_DF; // λ<>ƹ<EFBFBD><C6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<int16_t, 3> U_Fluctuation; // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>
std::array<int16_t, 3> U_Flicker; // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>
std::array<int16_t, 3> UL_Flicker; // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><ECBAAF>
tagPqData() : name(0), Data_Type(0) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>Ϊ0
Rms.fill(0);
UU_Deviation.fill(0);
UL_Deviation.fill(0);
F_Deviation.fill(0);
for (auto& arr : UI_Seq) arr.fill(0);
for (auto& arr : FuHarm) arr.fill(0);
for (auto& arr : FuHarmPhase) arr.fill(0);
for (auto& arr : Harm_Contain) arr.fill(0);
Harm_Aberrance.fill(0);
Cos_PF.fill(0);
Cos_DF.fill(0);
U_Fluctuation.fill(0);
U_Flicker.fill(0);
UL_Flicker.fill(0);
}
// <20><>ȡ<EFBFBD><EFBFBD><E1B9B9><EFBFBD><EFBFBD>С
static constexpr size_t GetSize() {
return sizeof(name) + sizeof(Data_Type) +
tagTime::GetSize() +
sizeof(Rms) +
sizeof(UU_Deviation) +
sizeof(UL_Deviation) +
sizeof(F_Deviation) +
sizeof(UI_Seq) +
sizeof(FuHarm) +
sizeof(FuHarmPhase) +
sizeof(InHarm) +
sizeof(Total_Power) +
sizeof(Harm_Power) +
sizeof(Harm_Contain) +
sizeof(Harm_Aberrance) +
sizeof(Cos_PF) +
sizeof(Cos_DF) +
sizeof(U_Fluctuation) +
sizeof(U_Flicker) +
sizeof(UL_Flicker);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool SetStructBuf(const uint8_t* bArray, size_t bufSize, size_t offset = 0) {
if (bufSize - offset < GetSize()) {
return false;
}
const uint8_t* ptr = bArray + offset;
size_t remaining = bufSize - offset;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>
name = ntohs(*reinterpret_cast<const int16_t*>(ptr));
ptr += sizeof(name);
remaining -= sizeof(name);
Data_Type = ntohs(*reinterpret_cast<const int16_t*>(ptr));
ptr += sizeof(Data_Type);
remaining -= sizeof(Data_Type);
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>
if (!time.SetStructBuf(ptr, remaining)) {
return false;
}
ptr += tagTime::GetSize();
remaining -= tagTime::GetSize();
// <20><><EFBFBD><EFBFBD>һάint32<33><32><EFBFBD><EFBFBD> - ʹ<><CAB9><EFBFBD><EFBFBD>ʽѭ<CABD><D1AD>
for (auto& val : Rms) {
if (remaining < sizeof(int32_t)) return false;
val = ntohl(*reinterpret_cast<const int32_t*>(ptr));
ptr += sizeof(int32_t);
remaining -= sizeof(int32_t);
}
for (auto& val : UU_Deviation) {
if (remaining < sizeof(int32_t)) return false;
val = ntohl(*reinterpret_cast<const int32_t*>(ptr));
ptr += sizeof(int32_t);
remaining -= sizeof(int32_t);
}
for (auto& val : UL_Deviation) {
if (remaining < sizeof(int32_t)) return false;
val = ntohl(*reinterpret_cast<const int32_t*>(ptr));
ptr += sizeof(int32_t);
remaining -= sizeof(int32_t);
}
for (auto& val : F_Deviation) {
if (remaining < sizeof(int32_t)) return false;
val = ntohl(*reinterpret_cast<const int32_t*>(ptr));
ptr += sizeof(int32_t);
remaining -= sizeof(int32_t);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>άint32<33><32><EFBFBD><EFBFBD> - ʹ<><CAB9><EFBFBD><EFBFBD>ʽѭ<CABD><D1AD>
for (auto& arr : UI_Seq) {
for (auto& val : arr) {
if (remaining < sizeof(int32_t)) return false;
val = ntohl(*reinterpret_cast<const int32_t*>(ptr));
ptr += sizeof(int32_t);
remaining -= sizeof(int32_t);
}
}
for (auto& arr : FuHarm) {
for (auto& val : arr) {
if (remaining < sizeof(int32_t)) return false;
val = ntohl(*reinterpret_cast<const int32_t*>(ptr));
ptr += sizeof(int32_t);
remaining -= sizeof(int32_t);
}
}
for (auto& arr : FuHarmPhase) {
for (auto& val : arr) {
if (remaining < sizeof(int32_t)) return false;
val = ntohl(*reinterpret_cast<const int32_t*>(ptr));
ptr += sizeof(int32_t);
remaining -= sizeof(int32_t);
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (auto& arr : InHarm) {
for (auto& item : arr) {
if (remaining < tagInHarmData::GetSize()) return false;
item.SetStructBuf(ptr);
ptr += tagInHarmData::GetSize();
remaining -= tagInHarmData::GetSize();
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ܹ<EFBFBD><DCB9><EFBFBD>
for (auto& arr : Total_Power) {
for (auto& val : arr) {
if (remaining < sizeof(int32_t)) return false;
val = ntohl(*reinterpret_cast<const int32_t*>(ptr));
ptr += sizeof(int32_t);
remaining -= sizeof(int32_t);
}
}
// <20><><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (auto& arr : Harm_Power) {
for (auto& item : arr) {
if (remaining < tagPowerData::GetSize()) return false;
item.SetStructBuf(ptr);
ptr += tagPowerData::GetSize();
remaining -= tagPowerData::GetSize();
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>άint16<31><36><EFBFBD><EFBFBD> - ʹ<><CAB9><EFBFBD><EFBFBD>ʽѭ<CABD><D1AD>
for (auto& arr : Harm_Contain) {
for (auto& val : arr) {
if (remaining < sizeof(int16_t)) return false;
val = ntohs(*reinterpret_cast<const int16_t*>(ptr));
ptr += sizeof(int16_t);
remaining -= sizeof(int16_t);
}
}
// <20><><EFBFBD><EFBFBD>һάint16<31><36><EFBFBD><EFBFBD> - ʹ<><CAB9><EFBFBD><EFBFBD>ʽѭ<CABD><D1AD>
for (auto& val : Harm_Aberrance) {
if (remaining < sizeof(int16_t)) return false;
val = ntohs(*reinterpret_cast<const int16_t*>(ptr));
ptr += sizeof(int16_t);
remaining -= sizeof(int16_t);
}
for (auto& val : Cos_PF) {
if (remaining < sizeof(int16_t)) return false;
val = ntohs(*reinterpret_cast<const int16_t*>(ptr));
ptr += sizeof(int16_t);
remaining -= sizeof(int16_t);
}
for (auto& val : Cos_DF) {
if (remaining < sizeof(int16_t)) return false;
val = ntohs(*reinterpret_cast<const int16_t*>(ptr));
ptr += sizeof(int16_t);
remaining -= sizeof(int16_t);
}
for (auto& val : U_Fluctuation) {
if (remaining < sizeof(int16_t)) return false;
val = ntohs(*reinterpret_cast<const int16_t*>(ptr));
ptr += sizeof(int16_t);
remaining -= sizeof(int16_t);
}
for (auto& val : U_Flicker) {
if (remaining < sizeof(int16_t)) return false;
val = ntohs(*reinterpret_cast<const int16_t*>(ptr));
ptr += sizeof(int16_t);
remaining -= sizeof(int16_t);
}
for (auto& val : UL_Flicker) {
if (remaining < sizeof(int16_t)) return false;
val = ntohs(*reinterpret_cast<const int16_t*>(ptr));
ptr += sizeof(int16_t);
remaining -= sizeof(int16_t);
}
return true;
}
};
#pragma pack(pop)
// <20><>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
struct tagInHarmData_float {
float Val;
float f;
};
// <20><><EFBFBD>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD>
struct tagPowerData_float {
float P;
float Q;
float S;
};
// PQ<50><51><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD><EFBFBD>
class tagPqData_Float {
public:
short name; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
short Data_Type; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tagTime time; // ʱ<><CAB1>
// <20><><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<float, 9> Rms;
std::array<float, 6> UU_Deviation;
std::array<float, 6> UL_Deviation;
std::array<float, 2> F_Deviation;
std::array<std::array<float, 4>, 2> UI_Seq;
std::array<std::array<float, HARMNUM>, 6> FuHarm;
std::array<std::array<float, HARMNUM>, 6> FuHarmPhase;
std::array<std::array<tagInHarmData_float, HARMNUM>, 6> InHarm;
std::array<std::array<float, 3>, 4> Total_Power;
std::array<std::array<tagPowerData_float, HARMNUM>, 4> Harm_Power;
std::array<std::array<float, HARMNUM>, 6> Harm_Contain;
std::array<float, 6> Harm_Aberrance; // ע<>⣺C#<23><><EFBFBD><EFBFBD><38><D4AA>
std::array<float, 4> Cos_PF;
std::array<float, 4> Cos_DF;
std::array<float, 3> U_Fluctuation;
std::array<float, 3> U_Flicker;
std::array<float, 3> UL_Flicker;
// <20><><EFBFBD><EFBFBD><ECBAAF><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
tagPqData_Float() {
Rms.fill(0.0f);
UU_Deviation.fill(0.0f);
UL_Deviation.fill(0.0f);
F_Deviation.fill(0.0f);
for (auto& arr : UI_Seq) arr.fill(0.0f);
for (auto& arr : FuHarm) arr.fill(0.0f);
for (auto& arr : FuHarmPhase) arr.fill(0.0f);
for (auto& arr : Harm_Contain) arr.fill(0.0f);
Harm_Aberrance.fill(0.0f);
Cos_PF.fill(0.0f);
Cos_DF.fill(0.0f);
U_Fluctuation.fill(0.0f);
U_Flicker.fill(0.0f);
UL_Flicker.fill(0.0f);
// <20><>ʼ<EFBFBD><CABC>Ƕ<EFBFBD>׽ṹ
for (auto& arr : InHarm) {
for (auto& item : arr) {
item = tagInHarmData_float{ 0.0f, 0.0f };
}
}
for (auto& arr : Harm_Power) {
for (auto& item : arr) {
item = tagPowerData_float{ 0.0f, 0.0f, 0.0f };
}
}
}
// ת<><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void SetFloatValue(const tagPqData& SrcData, float fPT, float fCT) {
time.Clone(SrcData.time);
// F_Deviation
for (int i = 0; i < 2; i++) {
F_Deviation[i] = IntToFloat(SrcData.F_Deviation[i]);
}
// UI_Seq
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 4; j++) {
if (i == 0) { // <20><>ѹ
if (j == 2) { // <20><><EFBFBD><EFBFBD>
UI_Seq[i][j] = IntToFloat(SrcData.UI_Seq[i][j]) * fPT;
}
else if (j < 3) {
UI_Seq[i][j] = IntToFloat(SrcData.UI_Seq[i][j]) * fPT * 1000.0f;
}
else {
UI_Seq[i][j] = IntToFloat(SrcData.UI_Seq[i][j]);
}
}
else { // <20><><EFBFBD><EFBFBD>
if (j < 3) {
UI_Seq[i][j] = IntToFloat(SrcData.UI_Seq[i][j]) * fCT;
}
else {
UI_Seq[i][j] = IntToFloat(SrcData.UI_Seq[i][j]);
}
}
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 3; i++) {
U_Fluctuation[i] = ShorToFloat1000(SrcData.U_Fluctuation[i]);
U_Flicker[i] = ShorToFloat1000(SrcData.U_Flicker[i]);
UL_Flicker[i] = ShorToFloat1000(SrcData.UL_Flicker[i]);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 4; i++) {
Cos_PF[i] = ShorToFloat10000(SrcData.Cos_PF[i]);
Cos_DF[i] = ShorToFloat10000(SrcData.Cos_DF[i]);
}
// <20>ܹ<EFBFBD><DCB9><EFBFBD>
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 3; j++) {
Total_Power[i][j] = IntToFloat(SrcData.Total_Power[i][j]) * fPT * fCT;
}
}
// г<><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 4; i++) {
for (int j = 0; j < HARMNUM; j++) {
Harm_Power[i][j].P = IntToFloat(SrcData.Harm_Power[i][j].P) * fPT * fCT;
Harm_Power[i][j].Q = IntToFloat(SrcData.Harm_Power[i][j].Q) * fPT * fCT;
Harm_Power[i][j].S = IntToFloat(SrcData.Harm_Power[i][j].S) * fPT * fCT;
}
}
// г<><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 6; i++) {
UU_Deviation[i] = IntToFloat(SrcData.UU_Deviation[i]);
UL_Deviation[i] = IntToFloat(SrcData.UL_Deviation[i]);
Harm_Aberrance[i] = ShorToFloat100(SrcData.Harm_Aberrance[i]);
for (int j = 0; j < HARMNUM; j++) {
if (i < 3) { // <20><>ѹг<D1B9><D0B3>
FuHarm[i][j] = IntToFloat(SrcData.FuHarm[i][j]) * fPT;
}
else { // <20><><EFBFBD><EFBFBD>г<EFBFBD><D0B3>
FuHarm[i][j] = IntToFloat(SrcData.FuHarm[i][j]) * fCT;
}
FuHarmPhase[i][j] = IntToFloat(SrcData.FuHarmPhase[i][j]);
InHarm[i][j].Val = IntToFloat(SrcData.InHarm[i][j].Val);
Harm_Contain[i][j] = ShorToFloat100(SrcData.Harm_Contain[i][j]);
}
}
// RMSֵ
for (int i = 0; i < 9; i++) {
if (i > 2 && i < 6) { // <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>3,4,5)
Rms[i] = IntToFloat(SrcData.Rms[i]) * fCT;
}
else { // <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Rms[i] = IntToFloat(SrcData.Rms[i]) * fPT;
}
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>ת<EFBFBD><D7AA>ΪBase64<36>ַ<EFBFBD><D6B7><EFBFBD>
std::string ConvertToBase64() const {
// 1. <20><><EFBFBD><EFBFBD><EFBFBD>ܸ<EFBFBD><DCB8><EFBFBD><EFBFBD><EFBFBD>
const size_t total_floats = CalculateFloatCount();
// 2. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::vector<float> float_buffer;
float_buffer.reserve(total_floats);
SerializeFloats(float_buffer);
// 3. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3BBBA><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>
const size_t byte_size = float_buffer.size() * sizeof(float);
const unsigned char* byte_data =
reinterpret_cast<const unsigned char*>(float_buffer.data());
// 4. Base64<36><34><EFBFBD><EFBFBD>
return base64_encode(byte_data, byte_size);
}
// <20><><EFBFBD><EFBFBD><E3B8A1><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>
size_t CalculateFloatCount() const {
size_t count = 0;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
count += Rms.size();
count += UU_Deviation.size();
count += UL_Deviation.size();
count += F_Deviation.size();
// <20><>ά<EFBFBD><CEAC><EFBFBD><EFBFBD>
for (const auto& arr : UI_Seq) count += arr.size();
for (const auto& arr : FuHarm) count += arr.size();
for (const auto& arr : FuHarmPhase) count += arr.size();
// Ƕ<>׽ṹ<D7BD><E1B9B9><EFBFBD><EFBFBD>
for (const auto& arr : InHarm) {
for (const auto& item : arr) {
count += 2; // ÿ<><C3BF>tagInHarmData_float<61><74><EFBFBD><EFBFBD>2<EFBFBD><32>float
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (const auto& arr : Total_Power) count += arr.size();
for (const auto& arr : Harm_Power) {
for (const auto& item : arr) {
count += 3; // ÿ<><C3BF>tagPowerData_float<61><74><EFBFBD><EFBFBD>3<EFBFBD><33>float
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (const auto& arr : Harm_Contain) count += arr.size();
count += Harm_Aberrance.size();
count += Cos_PF.size();
count += Cos_DF.size();
count += U_Fluctuation.size();
count += U_Flicker.size();
count += UL_Flicker.size();
return count;
}
//<2F><><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>ת<EFBFBD><D7AA>
std::string ConvertToBase64_Delta() const {
std::vector<float> float_buffer;
// 0-8λ<38><CEBB>Rmsȡ0-8
for (int i = 0; i < 9; ++i) {
float_buffer.push_back(Rms[i]);
}
// 9-11λ<31><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 3; ++i) {
float_buffer.push_back(3.1415f);
}
// 12-14λ<34><CEBB>UU_Deviation<6F><6E>UL_Deviation<6F><6E><EFBFBD><EFBFBD>ȡǰ<C8A1><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>Ϊ0<CEAA><30>ֵ
for (int i = 0; i < 3; ++i) {
float val = (UU_Deviation[i] != 0.0f) ? UU_Deviation[i] : UL_Deviation[i];
float_buffer.push_back(val);
}
// 15-16λ<36><CEBB>F_Deviation<6F><6E>ȡ0-1
for (int i = 0; i < 2; ++i) {
float_buffer.push_back(F_Deviation[i]);
}
// <20>ٺ<EFBFBD><38><CEBB>UI_Seqȡ0-7
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 4; ++j) {
if (i * 4 + j < 8) { // ֻȡǰ8<C7B0><38>
float_buffer.push_back(UI_Seq[i][j]);
}
}
}
// <20>ٺ<EFBFBD>49*3λ<33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 49 * 3; ++i) {
float_buffer.push_back(3.1415f);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>FuHarm<72><6D>3<EFBFBD><33>ȡ1-49λ
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(FuHarm[3][i]);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>FuHarm<72><6D>4<EFBFBD><34>ȡ1-49λ
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(FuHarm[4][i]);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>FuHarm<72><6D>5<EFBFBD><35>ȡ1-49λ
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(FuHarm[5][i]);
}
// <20>ٺ<EFBFBD>49*3λ<33><CEBB>FuHarm<72><6D>0-2<><32>ȡ1-49λ
for (int j = 0; j < 3; ++j) {
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(FuHarm[j][i]);
}
}
// <20>ٺ<EFBFBD>49*3λ<33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 49 * 3; ++i) {
float_buffer.push_back(3.1415f);
}
// <20>ٺ<EFBFBD>49*3λ<33><CEBB><EFBFBD>δ<EFBFBD>FuHarmPhase<73><65>3-5<><35>ȡ1-49λ
for (int j = 3; j < 6; ++j) {
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(FuHarmPhase[j][i]);
}
}
// <20>ٺ<EFBFBD>49*3λ<33><CEBB><EFBFBD>δ<EFBFBD>FuHarmPhase<73><65>0-2<><32>ȡ1-49λ
for (int j = 0; j < 3; ++j) {
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(FuHarmPhase[j][i]);
}
}
// <20>ٺ<EFBFBD>50*3λ<33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 50 * 3; ++i) {
float_buffer.push_back(3.1415f);
}
// <20>ٺ<EFBFBD>50*3λ<33><CEBB><EFBFBD>δ<EFBFBD>InHarm<72><6D>3-5<><35>ȡ0-49λ<39>е<EFBFBD>valָ<6C><D6B8>
for (int j = 3; j < 6; ++j) {
for (int i = 0; i < HARMNUM; ++i) {
float_buffer.push_back(InHarm[j][i].Val);
}
}
// <20>ٺ<EFBFBD>50*3λ<33><CEBB><EFBFBD>δ<EFBFBD>InHarm<72><6D>0-2<><32>ȡ0-49λ<39>е<EFBFBD>valָ<6C><D6B8>
for (int j = 0; j < 3; ++j) {
for (int i = 0; i < HARMNUM; ++i) {
float_buffer.push_back(InHarm[j][i].Val);
}
}
// <20>ٺ<EFBFBD>12λ<32><CEBB><EFBFBD>δ<EFBFBD>Total_Power<65><72>0-3<><33>ȡ0-2λ
for (int j = 0; j < 4; ++j) {
for (int i = 0; i < 3; ++i) {
float_buffer.push_back(Total_Power[j][i]);
}
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ0<C8A1><30>1-49<34>е<EFBFBD>
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(Harm_Power[0][i].P);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ0<C8A1><30>1-49<34>е<EFBFBD>
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(Harm_Power[0][i].Q);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ0<C8A1><30>1-49<34>е<EFBFBD>
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(Harm_Power[0][i].S);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ1<C8A1><31>1-49<34>е<EFBFBD>
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(Harm_Power[1][i].P);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ1<C8A1><31>1-49<34>е<EFBFBD>
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(Harm_Power[1][i].Q);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ1<C8A1><31>1-49<34>е<EFBFBD>
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(Harm_Power[1][i].S);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ2<C8A1><32>1-49<34>е<EFBFBD>
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(Harm_Power[2][i].P);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ2<C8A1><32>1-49<34>е<EFBFBD>
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(Harm_Power[2][i].Q);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ2<C8A1><32>1-49<34>е<EFBFBD>
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(Harm_Power[2][i].S);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ3<C8A1><33>1-49<34>е<EFBFBD>
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(Harm_Power[3][i].P);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ3<C8A1><33>1-49<34>е<EFBFBD>
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(Harm_Power[3][i].Q);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ3<C8A1><33>1-49<34>е<EFBFBD>
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(Harm_Power[3][i].S);
}
// <20>ٺ<EFBFBD>49*3λ<33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 49 * 3; ++i) {
float_buffer.push_back(3.1415f);
}
// <20>ٺ<EFBFBD>49*3λ<33><CEBB>Harm_Contain<69>е<EFBFBD>3-5<><35>ȡ1-49λ
for (int j = 3; j < 6; ++j) {
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(Harm_Contain[j][i]);
}
}
// <20>ٺ<EFBFBD>49*3λ<33><CEBB>Harm_Contain<69>е<EFBFBD>0-2<><32>ȡ1-49λ
for (int j = 0; j < 3; ++j) {
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(Harm_Contain[j][i]);
}
}
// <20>ٺ<EFBFBD><33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 3; ++i) {
float_buffer.push_back(3.1415f);
}
// <20>ٺ<EFBFBD><33><CEBB>Harm_Aberrance<63>е<EFBFBD>3-5<><35>ȡֵ
for (int i = 3; i < 6; ++i) {
float_buffer.push_back(Harm_Aberrance[i]);
}
// <20>ٺ<EFBFBD><33><CEBB>Harm_Aberrance<63>е<EFBFBD>0-2<><32>ȡֵ
for (int i = 0; i < 3; ++i) {
float_buffer.push_back(Harm_Aberrance[i]);
}
// <20>ٺ<EFBFBD><34><CEBB>Cos_PF<50><46>ȡ0-3
for (int i = 0; i < 4; ++i) {
float_buffer.push_back(Cos_PF[i]);
}
// <20>ٺ<EFBFBD><34><CEBB>Cos_DF<44><46>ȡ0-3
for (int i = 0; i < 4; ++i) {
float_buffer.push_back(Cos_DF[i]);
}
// <20>ٺ<EFBFBD><33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 3; ++i) {
float_buffer.push_back(3.1415f);
}
// <20>ٺ<EFBFBD><33><CEBB>U_Fluctuation<6F><6E>ȡ0-2
for (int i = 0; i < 3; ++i) {
float_buffer.push_back(U_Fluctuation[i]);
}
// <20>ٺ<EFBFBD><33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 3; ++i) {
float_buffer.push_back(3.1415f);
}
// <20>ٺ<EFBFBD><33><CEBB>U_Flicker<65><72>ȡ0-2
for (int i = 0; i < 3; ++i) {
float_buffer.push_back(U_Flicker[i]);
}
// <20>ٺ<EFBFBD><33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 3; ++i) {
float_buffer.push_back(3.1415f);
}
// <20>ٺ<EFBFBD><33><CEBB>UL_Flicker<65><72>ȡ0-2
for (int i = 0; i < 3; ++i) {
float_buffer.push_back(UL_Flicker[i]);
}
// ת<><D7AA>ΪBase64
const size_t byte_size = float_buffer.size() * sizeof(float);
const unsigned char* byte_data = reinterpret_cast<const unsigned char*>(float_buffer.data());
return base64_encode(byte_data, byte_size);
}
//<2F><><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>ת<EFBFBD><D7AA>
std::string ConvertToBase64_Star() const {
std::vector<float> float_buffer;
// 0-8λ<38><CEBB>Rmsȡ0-8
for (int i = 0; i < 9; ++i) {
float_buffer.push_back(Rms[i]);
}
// 9-11λ<31><CEBB>UU_Deviation<6F><6E>UL_Deviation<6F><6E><EFBFBD><EFBFBD>ȡǰ<C8A1><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>Ϊ0<CEAA><30>ֵ
for (int i = 0; i < 3; ++i) {
float val = (UU_Deviation[i] != 0.0f) ? UU_Deviation[i] : UL_Deviation[i];
float_buffer.push_back(val);
}
// 12-14λ<34><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 3; ++i) {
float_buffer.push_back(3.1415f);
}
// 15-16λ<36><CEBB>F_Deviation<6F><6E>ȡ0-1
for (int i = 0; i < 2; ++i) {
float_buffer.push_back(F_Deviation[i]);
}
// <20>ٺ<EFBFBD><38><CEBB>UI_Seqȡ0-7
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 4; ++j) {
if (i * 4 + j < 8) { // ֻȡǰ8<C7B0><38>
float_buffer.push_back(UI_Seq[i][j]);
}
}
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>FuHarm<72><6D>0<EFBFBD><30>ȡ1-49λ (ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>ʼ)
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(FuHarm[0][i]);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>FuHarm<72><6D>1<EFBFBD><31>ȡ1-49λ
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(FuHarm[1][i]);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>FuHarm<72><6D>2<EFBFBD><32>ȡ1-49λ
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(FuHarm[2][i]);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>FuHarm<72><6D>3<EFBFBD><33>ȡ1-49λ
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(FuHarm[3][i]);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>FuHarm<72><6D>4<EFBFBD><34>ȡ1-49λ
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(FuHarm[4][i]);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>FuHarm<72><6D>5<EFBFBD><35>ȡ1-49λ
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(FuHarm[5][i]);
}
// <20>ٺ<EFBFBD>49*3λ<33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 49 * 3; ++i) {
float_buffer.push_back(3.1415f);
}
// <20>ٺ<EFBFBD>49*3λ<33><CEBB><EFBFBD>δ<EFBFBD>FuHarmPhase<73><65>0-2<><32>ȡ1-49λ
for (int j = 0; j < 3; ++j) {
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(FuHarmPhase[j][i]);
}
}
// <20>ٺ<EFBFBD>49*3λ<33><CEBB><EFBFBD>δ<EFBFBD>FuHarmPhase<73><65>3-5<><35>ȡ1-49λ
for (int j = 3; j < 6; ++j) {
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(FuHarmPhase[j][i]);
}
}
// <20>ٺ<EFBFBD>49*3λ<33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 49 * 3; ++i) {
float_buffer.push_back(3.1415f);
}
// <20>ٺ<EFBFBD>50*6λ<36><CEBB><EFBFBD>δ<EFBFBD>InHarm<72><6D>0-5<><35>ȡ0-49λ<39>е<EFBFBD>valָ<6C><D6B8>
for (int j = 0; j < 6; ++j) {
for (int i = 0; i < HARMNUM; ++i) {
float_buffer.push_back(InHarm[j][i].Val);
}
}
// <20>ٺ<EFBFBD>50*3λ<33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 50 * 3; ++i) {
float_buffer.push_back(3.1415f);
}
// <20>ٺ<EFBFBD>12λ<32><CEBB><EFBFBD>δ<EFBFBD>Total_Power<65><72>0-3<><33>ȡ0-2λ
for (int j = 0; j < 4; ++j) {
for (int i = 0; i < 3; ++i) {
float_buffer.push_back(Total_Power[j][i]);
}
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ0<C8A1><30>1-49<34>е<EFBFBD>
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(Harm_Power[0][i].P);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ0<C8A1><30>1-49<34>е<EFBFBD>
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(Harm_Power[0][i].Q);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ0<C8A1><30>1-49<34>е<EFBFBD>
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(Harm_Power[0][i].S);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ1<C8A1><31>1-49<34>е<EFBFBD>
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(Harm_Power[1][i].P);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ1<C8A1><31>1-49<34>е<EFBFBD>
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(Harm_Power[1][i].Q);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ1<C8A1><31>1-49<34>е<EFBFBD>
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(Harm_Power[1][i].S);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ2<C8A1><32>1-49<34>е<EFBFBD>
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(Harm_Power[2][i].P);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ2<C8A1><32>1-49<34>е<EFBFBD>
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(Harm_Power[2][i].Q);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ2<C8A1><32>1-49<34>е<EFBFBD>
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(Harm_Power[2][i].S);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ3<C8A1><33>1-49<34>е<EFBFBD>
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(Harm_Power[3][i].P);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ3<C8A1><33>1-49<34>е<EFBFBD>
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(Harm_Power[3][i].Q);
}
// <20>ٺ<EFBFBD>49λ<39><CEBB>Harm_Power<65><72>ȡ3<C8A1><33>1-49<34>е<EFBFBD>
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(Harm_Power[3][i].S);
}
// <20>ٺ<EFBFBD>49*6λ<36><CEBB>Harm_Contain<69>е<EFBFBD>0-5<><35>ȡ1-49λ
for (int j = 0; j < 6; ++j) {
for (int i = 1; i < HARMNUM; ++i) {
float_buffer.push_back(Harm_Contain[j][i]);
}
}
// <20>ٺ<EFBFBD>49*3λ<33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 49 * 3; ++i) {
float_buffer.push_back(3.1415f);
}
// <20>ٺ<EFBFBD><36><CEBB>Harm_Aberrance<63>е<EFBFBD>0-5<><35>ȡֵ
for (int i = 0; i < 6; ++i) {
float_buffer.push_back(Harm_Aberrance[i]);
}
// <20>ٺ<EFBFBD><33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 3; ++i) {
float_buffer.push_back(3.1415f);
}
// <20>ٺ<EFBFBD><34><CEBB>Cos_PF<50><46>ȡ0-3
for (int i = 0; i < 4; ++i) {
float_buffer.push_back(Cos_PF[i]);
}
// <20>ٺ<EFBFBD><34><CEBB>Cos_DF<44><46>ȡ0-3
for (int i = 0; i < 4; ++i) {
float_buffer.push_back(Cos_DF[i]);
}
// <20>ٺ<EFBFBD><33><CEBB>U_Fluctuation<6F><6E>ȡ0-2
for (int i = 0; i < 3; ++i) {
float_buffer.push_back(U_Fluctuation[i]);
}
// <20>ٺ<EFBFBD><33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 3; ++i) {
float_buffer.push_back(3.1415f);
}
// <20>ٺ<EFBFBD><33><CEBB>U_Flicker<65><72>ȡ0-2
for (int i = 0; i < 3; ++i) {
float_buffer.push_back(U_Flicker[i]);
}
// <20>ٺ<EFBFBD><33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 3; ++i) {
float_buffer.push_back(3.1415f);
}
// <20>ٺ<EFBFBD><33><CEBB>UL_Flicker<65><72>ȡ0-2
for (int i = 0; i < 3; ++i) {
float_buffer.push_back(UL_Flicker[i]);
}
// <20>ٺ<EFBFBD><33><CEBB>λ3.1415<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 3; ++i) {
float_buffer.push_back(3.1415f);
}
// ת<><D7AA>ΪBase64
const size_t byte_size = float_buffer.size() * sizeof(float);
const unsigned char* byte_data = reinterpret_cast<const unsigned char*>(float_buffer.data());
return base64_encode(byte_data, byte_size);
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߷<EFBFBD>ʽѡ<CABD><D1A1>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ʽ
std::string ConvertToBase64(int type) const {
//1Ϊ<31><CEAA><EFBFBD>ͽ<EFBFBD><CDBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD>߼<EFBFBD>
if (type == 1) {
return ConvertToBase64_Delta();
}
else {
return ConvertToBase64_Star();
}
}
private:
// <20><><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void SerializeFloats(std::vector<float>& buffer) const {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (const auto& val : Rms) buffer.push_back(val);
for (const auto& val : UU_Deviation) buffer.push_back(val);
for (const auto& val : UL_Deviation) buffer.push_back(val);
for (const auto& val : F_Deviation) buffer.push_back(val);
// <20><>ά<EFBFBD><CEAC><EFBFBD><EFBFBD>
for (const auto& arr : UI_Seq) {
for (const auto& val : arr) buffer.push_back(val);
}
for (const auto& arr : FuHarm) {
for (const auto& val : arr) buffer.push_back(val);
}
for (const auto& arr : FuHarmPhase) {
for (const auto& val : arr) buffer.push_back(val);
}
// Ƕ<>׽ṹ<D7BD><E1B9B9><EFBFBD><EFBFBD>
for (const auto& arr : InHarm) {
for (const auto& item : arr) {
buffer.push_back(item.Val);
buffer.push_back(item.f);
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (const auto& arr : Total_Power) {
for (const auto& val : arr) buffer.push_back(val);
}
for (const auto& arr : Harm_Power) {
for (const auto& item : arr) {
buffer.push_back(item.P);
buffer.push_back(item.Q);
buffer.push_back(item.S);
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (const auto& arr : Harm_Contain) {
for (const auto& val : arr) buffer.push_back(val);
}
for (const auto& val : Harm_Aberrance) buffer.push_back(val);
for (const auto& val : Cos_PF) buffer.push_back(val);
for (const auto& val : Cos_DF) buffer.push_back(val);
for (const auto& val : U_Fluctuation) buffer.push_back(val);
for (const auto& val : U_Flicker) buffer.push_back(val);
for (const auto& val : UL_Flicker) buffer.push_back(val);
}
// Base64<36><34><EFBFBD><EFBFBD><EBBAAF>
static std::string base64_encode(const unsigned char* bytes_to_encode, size_t in_len) {
static const char base64_chars[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/";
std::string ret;
int i = 0;
int j = 0;
unsigned char char_array_3[3];
unsigned char char_array_4[4];
while (in_len--) {
char_array_3[i++] = *(bytes_to_encode++);
if (i == 3) {
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) +
((char_array_3[1] & 0xf0) >> 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) +
((char_array_3[2] & 0xc0) >> 6);
char_array_4[3] = char_array_3[2] & 0x3f;
for (i = 0; i < 4; i++)
ret += base64_chars[char_array_4[i]];
i = 0;
}
}
if (i) {
for (j = i; j < 3; j++)
char_array_3[j] = '\0';
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) +
((char_array_3[1] & 0xf0) >> 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) +
((char_array_3[2] & 0xc0) >> 6);
char_array_4[3] = char_array_3[2] & 0x3f;
for (j = 0; j < i + 1; j++)
ret += base64_chars[char_array_4[j]];
while (i++ < 3)
ret += '=';
}
return ret;
}
};
//<2F><><EFBFBD><EFBFBD><E3B1A8>֡<EFBFBD><D6A1><EFBFBD><EFBFBD> 1֡1024Ϊ1K ͳ<><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
constexpr int PqDataLen = tagPqData::GetSize();
constexpr int Stat_PacketNum = (PqDataLen / 1024 > 0) ? (PqDataLen / 1024 + 1) : (PqDataLen / 1024);
2025-06-13 11:29:59 +08:00
//ʵʱ<CAB5><CAB1><EFBFBD>ݽṹ<DDBD><E1B9B9>1<EFBFBD>ֽڶ<D6BD><DAB6>
#pragma pack(push, 1)
class RealtagPqDate_float {
public:
tagTime time; // ʱ<><CAB1>
//ʵʱ<CAB5><CAB1><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<float, 9> Rms; //<2F><><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD>ߵ<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Чֵ
std::array<float, 6> UU_Deviation; //<2F><><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD>ߵ<EFBFBD>ѹ<EFBFBD><D1B9>ƫ<EFBFBD><C6AB>
std::array<float, 6> UL_Deviation; //<2F><><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD>ߵ<EFBFBD>ѹ<EFBFBD><D1B9>ƫ<EFBFBD><C6AB>
std::array<float, 6> THD; //<2F><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<float, 2> FREQ; //Ƶ<>ʼ<EFBFBD>Ƶ<EFBFBD><C6B5>ƫ<EFBFBD><C6AB>
std::array<std::array<float, 5>, 2> UI_Seq;//<2F><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>
std::array<std::array<float, 3>, 4> TOTAL_POWER;//<2F><><EFBFBD><EFBFBD>ܹ<EFBFBD><DCB9><EFBFBD>P<EFBFBD><50>Q<EFBFBD><51>S
std::array<float, 4> COS_PF; //<2F><><EFBFBD>ڹ<EFBFBD><DAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<float, 4> COS_DF; //λ<>ƹ<EFBFBD><C6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//----------- <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<std::array<float, HARMNUM>, 3> HARMV;//г<><D0B3><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//----------- <20><><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<std::array<float, HARMNUM>, 3> HARMI;//г<><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
//----------- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<std::array<float, HARMNUM>, 3> HARMVP;//г<><D0B3><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>λ
//----------- <20><><EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD><C4B0><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<std::array<float, HARMNUM>, 3> HARMIP;//г<><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
//----------- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::array<std::array<float, HARMNUM>, 3> INHARMV;//<2F><>г<EFBFBD><D0B3><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>ֵ
//----------- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><ECBAAF> - <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RealtagPqDate_float() {
// <20><>ʼ<EFBFBD><CABC>ʱ<EFBFBD><CAB1>
time = tagTime(); // <20><><EFBFBD><EFBFBD>tagTime<6D><65>Ĭ<EFBFBD>Ϲ<EFBFBD><CFB9><EFBFBD><ECBAAF>
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Rms.fill(0.0f);
UU_Deviation.fill(0.0f);
UL_Deviation.fill(0.0f);
THD.fill(0.0f);
FREQ.fill(0.0f);
COS_PF.fill(0.0f);
COS_DF.fill(0.0f);
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ά<EFBFBD><CEAC><EFBFBD><EFBFBD>
for (auto& arr : UI_Seq) {
arr.fill(0.0f);
}
for (auto& arr : TOTAL_POWER) {
arr.fill(0.0f);
}
// <20><>ʼ<EFBFBD><CABC>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (auto& arr : HARMV) {
arr.fill(0.0f);
}
for (auto& arr : HARMI) {
arr.fill(0.0f);
}
for (auto& arr : HARMVP) {
arr.fill(0.0f);
}
for (auto& arr : HARMIP) {
arr.fill(0.0f);
}
for (auto& arr : INHARMV) {
arr.fill(0.0f);
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>ȡfloat
float read_net_float(const uint8_t* ptr) {
uint32_t temp;
memcpy(&temp, ptr, sizeof(uint32_t));
temp = ntohl(temp);
float result;
memcpy(&result, &temp, sizeof(float));
return result;
}
// ʵʱ<CAB5><CAB1><EFBFBD>ݽṹ<DDBD>ķְ<C4B7><D6B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool ParsePacket1(const uint8_t* data, size_t size) {
// <20><>С<EFBFBD><D0A1><EFBFBD><EFBFBD> = ʱ<><CAB1>(12<31>ֽ<EFBFBD>) + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(59<35><39>float * 4 = 236<33>ֽ<EFBFBD>) = 248<34>ֽ<EFBFBD>
const size_t min_size = tagTime::GetSize() + 59 * sizeof(float);
if (size < min_size) {
return false;
}
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
if (!time.SetStructBuf(data, size)) {
return false;
}
const uint8_t* ptr = data + tagTime::GetSize();
// <20><><EFBFBD><EFBFBD>Rms (9<><39>float)
for (int i = 0; i < 9; ++i) {
Rms[i] = read_net_float(ptr);
ptr += sizeof(float);
}
// <20><><EFBFBD><EFBFBD>UU_Deviation (6<><36>float)
for (int i = 0; i < 6; ++i) {
UU_Deviation[i] = read_net_float(ptr);
ptr += sizeof(float);
}
// <20><><EFBFBD><EFBFBD>UL_Deviation (6<><36>float)
for (int i = 0; i < 6; ++i) {
UL_Deviation[i] = read_net_float(ptr);
ptr += sizeof(float);
}
// <20><><EFBFBD><EFBFBD>THD (6<><36>float)
for (int i = 0; i < 6; ++i) {
THD[i] = read_net_float(ptr);
ptr += sizeof(float);
}
// <20><><EFBFBD><EFBFBD>FREQ (2<><32>float)
for (int i = 0; i < 2; ++i) {
FREQ[i] = read_net_float(ptr);
ptr += sizeof(float);
}
// <20><><EFBFBD><EFBFBD>UI_Seq (2x5<78><35>float)
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 5; ++j) {
UI_Seq[i][j] = read_net_float(ptr);
ptr += sizeof(float);
}
}
// <20><><EFBFBD><EFBFBD>TOTAL_POWER (4x3<78><33>float)
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 3; ++j) {
TOTAL_POWER[i][j] = read_net_float(ptr);
ptr += sizeof(float);
}
}
// <20><><EFBFBD><EFBFBD>COS_PF (4<><34>float)
for (int i = 0; i < 4; ++i) {
COS_PF[i] = read_net_float(ptr);
ptr += sizeof(float);
}
// <20><><EFBFBD><EFBFBD>COS_DF (4<><34>float)
for (int i = 0; i < 4; ++i) {
COS_DF[i] = read_net_float(ptr);
ptr += sizeof(float);
}
return true;
}
bool ParsePacket2(const uint8_t* data, size_t size) {
// <20><>С<EFBFBD><D0A1><EFBFBD><EFBFBD> = ʱ<><CAB1>(12<31>ֽ<EFBFBD>) + г<><D0B3><EFBFBD><EFBFBD>ѹ(150<35><30>float * 4 = 600<30>ֽ<EFBFBD>) = 612<31>ֽ<EFBFBD>
const size_t min_size = tagTime::GetSize() + 3 * HARMNUM * sizeof(float);
if (size < min_size) {
return false;
}
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E4A3A8><EFBFBD><EFBFBD>֮ǰ<D6AE><C7B0>ʱ<EFBFBD>
if (!time.SetStructBuf(data, size)) {
return false;
}
const uint8_t* ptr = data + tagTime::GetSize();
// <20><><EFBFBD><EFBFBD>HARMV (3xHARMNUM<55><4D>float)
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < HARMNUM; ++j) {
HARMV[i][j] = read_net_float(ptr);
ptr += sizeof(float);
}
}
return true;
}
bool ParsePacket3(const uint8_t* data, size_t size) {
// <20><>С<EFBFBD><D0A1><EFBFBD><EFBFBD> = ʱ<><CAB1>(12<31>ֽ<EFBFBD>) + г<><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(150<35><30>float * 4 = 600<30>ֽ<EFBFBD>) = 612<31>ֽ<EFBFBD>
const size_t min_size = tagTime::GetSize() + 3 * HARMNUM * sizeof(float);
if (size < min_size) {
return false;
}
if (!time.SetStructBuf(data, size)) {
return false;
}
const uint8_t* ptr = data + tagTime::GetSize();
// <20><><EFBFBD><EFBFBD>HARMI (3xHARMNUM<55><4D>float)
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < HARMNUM; ++j) {
HARMI[i][j] = read_net_float(ptr);
ptr += sizeof(float);
}
}
return true;
}
bool ParsePacket4(const uint8_t* data, size_t size) {
// <20><>С<EFBFBD><D0A1><EFBFBD><EFBFBD> = ʱ<><CAB1>(12<31>ֽ<EFBFBD>) + г<><D0B3><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9>λ(150<35><30>float * 4 = 600<30>ֽ<EFBFBD>) = 612<31>ֽ<EFBFBD>
const size_t min_size = tagTime::GetSize() + 3 * HARMNUM * sizeof(float);
if (size < min_size) {
return false;
}
if (!time.SetStructBuf(data, size)) {
return false;
}
const uint8_t* ptr = data + tagTime::GetSize();
// <20><><EFBFBD><EFBFBD>HARMVP (3xHARMNUM<55><4D>float)
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < HARMNUM; ++j) {
HARMVP[i][j] = read_net_float(ptr);
ptr += sizeof(float);
}
}
return true;
}
bool ParsePacket5(const uint8_t* data, size_t size) {
// <20><>С<EFBFBD><D0A1><EFBFBD><EFBFBD> = ʱ<><CAB1>(12<31>ֽ<EFBFBD>) + г<><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ(150<35><30>float * 4 = 600<30>ֽ<EFBFBD>) = 612<31>ֽ<EFBFBD>
const size_t min_size = tagTime::GetSize() + 3 * HARMNUM * sizeof(float);
if (size < min_size) {
return false;
}
if (!time.SetStructBuf(data, size)) {
return false;
}
const uint8_t* ptr = data + tagTime::GetSize();
// <20><><EFBFBD><EFBFBD>HARMIP (3xHARMNUM<55><4D>float)
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < HARMNUM; ++j) {
HARMIP[i][j] = read_net_float(ptr);
ptr += sizeof(float);
}
}
return true;
}
bool ParsePacket6(const uint8_t* data, size_t size) {
// <20><>С<EFBFBD><D0A1><EFBFBD><EFBFBD> = ʱ<><CAB1>(12<31>ֽ<EFBFBD>) + <20><>г<EFBFBD><D0B3><EFBFBD><EFBFBD>ѹ(150<35><30>float * 4 = 600<30>ֽ<EFBFBD>) = 612<31>ֽ<EFBFBD>
const size_t min_size = tagTime::GetSize() + 3 * HARMNUM * sizeof(float);
if (size < min_size) {
return false;
}
if (!time.SetStructBuf(data, size)) {
return false;
}
const uint8_t* ptr = data + tagTime::GetSize();
// <20><><EFBFBD><EFBFBD>INHARMV (3xHARMNUM<55><4D>float)
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < HARMNUM; ++j) {
INHARMV[i][j] = read_net_float(ptr);
ptr += sizeof(float);
}
}
return true;
}
// <20><><EFBFBD><EFBFBD><E3B8A1><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>
size_t CalculateFloatCount() const {
size_t count = 0;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
count += Rms.size();
count += UU_Deviation.size();
count += UL_Deviation.size();
count += THD.size();
count += FREQ.size();
count += COS_PF.size();
count += COS_DF.size();
// <20><>ά<EFBFBD><CEAC><EFBFBD><EFBFBD>
for (const auto& arr : UI_Seq) count += arr.size();
for (const auto& arr : TOTAL_POWER) count += arr.size();
for (const auto& arr : HARMV) count += arr.size();
for (const auto& arr : HARMI) count += arr.size();
for (const auto& arr : HARMVP) count += arr.size();
for (const auto& arr : HARMIP) count += arr.size();
for (const auto& arr : INHARMV) count += arr.size();
return count;
}
// <20><><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void SerializeFloats(std::vector<float>& buffer) const {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (float val : Rms) buffer.push_back(val);
for (float val : UU_Deviation) buffer.push_back(val);
for (float val : UL_Deviation) buffer.push_back(val);
for (float val : THD) buffer.push_back(val);
for (float val : FREQ) buffer.push_back(val);
// <20><>ά<EFBFBD><CEAC><EFBFBD><EFBFBD><E9A3A8>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (const auto& arr : UI_Seq) {
for (float val : arr) buffer.push_back(val);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (const auto& arr : TOTAL_POWER) {
for (float val : arr) buffer.push_back(val);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (float val : COS_PF) buffer.push_back(val);
for (float val : COS_DF) buffer.push_back(val);
// г<><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (const auto& arr : HARMV) {
for (float val : arr) buffer.push_back(val);
}
for (const auto& arr : HARMI) {
for (float val : arr) buffer.push_back(val);
}
for (const auto& arr : HARMVP) {
for (float val : arr) buffer.push_back(val);
}
for (const auto& arr : HARMIP) {
for (float val : arr) buffer.push_back(val);
}
for (const auto& arr : INHARMV) {
for (float val : arr) buffer.push_back(val);
}
}
// Base64<36><34><EFBFBD><EFBFBD><EBBAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>tagPqData_Float<61><74>ͬ<EFBFBD><CDAC>
static std::string base64_encode(const unsigned char* bytes_to_encode, size_t in_len) {
static const char base64_chars[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/";
std::string ret;
int i = 0;
int j = 0;
unsigned char char_array_3[3];
unsigned char char_array_4[4];
while (in_len--) {
char_array_3[i++] = *(bytes_to_encode++);
if (i == 3) {
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) +
((char_array_3[1] & 0xf0) >> 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) +
((char_array_3[2] & 0xc0) >> 6);
char_array_4[3] = char_array_3[2] & 0x3f;
for (i = 0; i < 4; i++)
ret += base64_chars[char_array_4[i]];
i = 0;
}
}
if (i) {
for (j = i; j < 3; j++)
char_array_3[j] = '\0';
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) << 4) +
((char_array_3[1] & 0xf0) >> 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) +
((char_array_3[2] & 0xc0) >> 6);
char_array_4[3] = char_array_3[2] & 0x3f;
for (j = 0; j < i + 1; j++)
ret += base64_chars[char_array_4[j]];
while (i++ < 3)
ret += '=';
}
return ret;
}
// <20><><EFBFBD><EFBFBD>Base64ת<34><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::string ConvertToBase64() const {
// 1. <20><><EFBFBD><EFBFBD><EFBFBD>ܸ<EFBFBD><DCB8><EFBFBD><EFBFBD><EFBFBD>
const size_t total_floats = CalculateFloatCount();
// 2. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::vector<float> float_buffer;
float_buffer.reserve(total_floats);
SerializeFloats(float_buffer);
// 3. ת<><D7AA>Ϊ<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD><EFBFBD>
const size_t byte_size = float_buffer.size() * sizeof(float);
const unsigned char* byte_data =
reinterpret_cast<const unsigned char*>(float_buffer.data());
return base64_encode(byte_data, byte_size);
}
std::string floatVectorToBase64(const std::vector<float>& float_buffer) const {
const size_t byte_size = float_buffer.size() * sizeof(float);
const unsigned char* byte_data =
reinterpret_cast<const unsigned char*>(float_buffer.data());
return base64_encode(byte_data, byte_size);
}
// <20><><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::string ConvertToBase64_Star() const {
std::vector<float> float_buffer;
// 0-8: RMSֵ
for (int i = 0; i < 9; ++i) {
float_buffer.push_back(Rms[i]);
}
// 9-11: <20><>ѹƫ<D1B9>ȡ<EEA3A8><C8A1>Ϊ0<CEAA><30>ֵ<EFBFBD><D6B5>
for (int i = 0; i < 3; ++i) {
float val = (UU_Deviation[i] != 0.0f) ? UU_Deviation[i] : UL_Deviation[i];
float_buffer.push_back(val);
}
// 12-14: <20><><EFBFBD>ã<EFBFBD><C3A3>ߵ<EFBFBD>ѹλ<D1B9>ã<EFBFBD>
for (int i = 0; i < 3; ++i) {
float_buffer.push_back(3.1415f);
}
// 15-20: THD<48>ܻ<EFBFBD><DCBB><EFBFBD><EFBFBD>ʣ<EFBFBD>0-5<><35>
for (int i = 0; i < 6; ++i) {
float_buffer.push_back(THD[i]);
}
// 21-23: <20><><EFBFBD>ã<EFBFBD><C3A3>ߵ<EFBFBD>ѹTHD<48><44>
for (int i = 0; i < 3; ++i) {
float_buffer.push_back(3.1415f);
}
// 24-25: Ƶ<>ʼ<EFBFBD>ƫ<EFBFBD><C6AB>
for (int i = 0; i < 2; ++i) {
float_buffer.push_back(FREQ[i]);
}
// 26-33: <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ8<C7B0><38>Ԫ<EFBFBD>أ<EFBFBD>
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 4; ++j) { // ȡÿ<C8A1>е<EFBFBD>ǰ4<C7B0><34>Ԫ<EFBFBD><D4AA>
if (i == 0 || j < 3) { // ȷ<><C8B7>ֻȡ8<C8A1><38>
float_buffer.push_back(UI_Seq[i][j]);
}
}
}
// 34-45: <20>ܹ<EFBFBD><DCB9><EFBFBD>
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 3; ++j) {
float_buffer.push_back(TOTAL_POWER[i][j]);
}
}
// 46-49: <20><><EFBFBD>ڹ<EFBFBD><DAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 4; ++i) {
float_buffer.push_back(COS_PF[i]);
}
// 50-53: λ<>ƹ<EFBFBD><C6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 4; ++i) {
float_buffer.push_back(COS_DF[i]);
}
// 54-200: <20><>ѹг<D1B9><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>1-49<34>Σ<EFBFBD>
for (int i = 0; i < 3; ++i) {
for (int j = 1; j < HARMNUM; ++j) {
float_buffer.push_back(HARMV[i][j]);
}
}
// 201-347: <20><><EFBFBD>ã<EFBFBD><C3A3>ߵ<EFBFBD>ѹг<D1B9><D0B3><EFBFBD><EFBFBD>
for (int i = 0; i < 3 * 49; ++i) {
float_buffer.push_back(3.1415f);
}
// 348-494: <20><><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>1-49<34>Σ<EFBFBD>
for (int i = 0; i < 3; ++i) {
for (int j = 1; j < HARMNUM; ++j) {
float_buffer.push_back(HARMI[i][j]);
}
}
// 495-641: <20><>ѹг<D1B9><D0B3><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>1-49<34>Σ<EFBFBD>
for (int i = 0; i < 3; ++i) {
for (int j = 1; j < HARMNUM; ++j) {
float_buffer.push_back(HARMVP[i][j]);
}
}
// 642-788: <20><><EFBFBD>ã<EFBFBD><C3A3>ߵ<EFBFBD>ѹг<D1B9><D0B3><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
for (int i = 0; i < 3 * 49; ++i) {
float_buffer.push_back(3.1415f);
}
// 789-935: <20><><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>1-49<34>Σ<EFBFBD>
for (int i = 0; i < 3; ++i) {
for (int j = 1; j < HARMNUM; ++j) {
float_buffer.push_back(HARMIP[i][j]);
}
}
// 936-1085: <20><>ѹ<EFBFBD><D1B9>г<EFBFBD><D0B3><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>0-49<34>Σ<EFBFBD>
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < HARMNUM; ++j) {
float_buffer.push_back(INHARMV[i][j]);
}
}
// 1086-1235: <20><><EFBFBD>ã<EFBFBD><C3A3>ߵ<EFBFBD>ѹ<EFBFBD><D1B9>г<EFBFBD><D0B3><EFBFBD><EFBFBD>
for (int i = 0; i < 3 * 50; ++i) {
float_buffer.push_back(3.1415f);
}
// ת<><D7AA>ΪBase64
return floatVectorToBase64(float_buffer);
}
// <20><><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::string ConvertToBase64_Delta() const {
std::vector<float> float_buffer;
// 0-8: RMSֵ
for (int i = 0; i < 9; ++i) {
float_buffer.push_back(Rms[i]);
}
// 9-11: <20><><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD>ѹλ<D1B9>ã<EFBFBD>
for (int i = 0; i < 3; ++i) {
float_buffer.push_back(3.1415f);
}
// 12-14: <20><>ѹƫ<D1B9>ȡ<EEA3A8><C8A1>Ϊ0<CEAA><30>ֵ<EFBFBD><D6B5>
for (int i = 0; i < 3; ++i) {
float val = (UU_Deviation[i] != 0.0f) ? UU_Deviation[i] : UL_Deviation[i];
float_buffer.push_back(val);
}
// 15-17: <20><><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD>ѹTHD<48><44>
for (int i = 0; i < 3; ++i) {
float_buffer.push_back(3.1415f);
}
// 18-20: THD<48>ߵ<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>3-5<><35>
for (int i = 3; i < 6; ++i) {
float_buffer.push_back(THD[i]);
}
// 21-23: THD<48><44><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>0-2<><32>
for (int i = 0; i < 3; ++i) {
float_buffer.push_back(THD[i]);
}
// 24-25: Ƶ<>ʼ<EFBFBD>ƫ<EFBFBD><C6AB>
for (int i = 0; i < 2; ++i) {
float_buffer.push_back(FREQ[i]);
}
// 26-33: <20><>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ8<C7B0><38>Ԫ<EFBFBD>أ<EFBFBD>
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 4; ++j) {
if (i == 0 || j < 3) {
float_buffer.push_back(UI_Seq[i][j]);
}
}
}
// 34-45: <20>ܹ<EFBFBD><DCB9><EFBFBD>
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 3; ++j) {
float_buffer.push_back(TOTAL_POWER[i][j]);
}
}
// 46-49: <20><><EFBFBD>ڹ<EFBFBD><DAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 4; ++i) {
float_buffer.push_back(COS_PF[i]);
}
// 50-53: λ<>ƹ<EFBFBD><C6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for (int i = 0; i < 4; ++i) {
float_buffer.push_back(COS_DF[i]);
}
// 54-200: <20><><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD>ѹг<D1B9><D0B3><EFBFBD><EFBFBD>
for (int i = 0; i < 3 * 49; ++i) {
float_buffer.push_back(3.1415f);
}
// 201-347: <20><>ѹг<D1B9><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD>1-49<34>Σ<EFBFBD>
for (int i = 0; i < 3; ++i) {
for (int j = 1; j < HARMNUM; ++j) {
float_buffer.push_back(HARMV[i][j]);
}
}
// 348-494: <20><><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>1-49<34>Σ<EFBFBD>
for (int i = 0; i < 3; ++i) {
for (int j = 1; j < HARMNUM; ++j) {
float_buffer.push_back(HARMI[i][j]);
}
}
// 495-641: <20><><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD>ѹг<D1B9><D0B3><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
for (int i = 0; i < 3 * 49; ++i) {
float_buffer.push_back(3.1415f);
}
// 642-788: <20><>ѹг<D1B9><D0B3><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>1-49<34>Σ<EFBFBD>
for (int i = 0; i < 3; ++i) {
for (int j = 1; j < HARMNUM; ++j) {
float_buffer.push_back(HARMVP[i][j]);
}
}
// 789-935: <20><><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>1-49<34>Σ<EFBFBD>
for (int i = 0; i < 3; ++i) {
for (int j = 1; j < HARMNUM; ++j) {
float_buffer.push_back(HARMIP[i][j]);
}
}
// 936-1085: <20><><EFBFBD>ã<EFBFBD><C3A3>ߵ<EFBFBD>ѹ<EFBFBD><D1B9>г<EFBFBD><D0B3><EFBFBD><EFBFBD>
for (int i = 0; i < 3 * 50; ++i) {
float_buffer.push_back(3.1415f);
}
// 1086-1235: <20><>ѹ<EFBFBD><D1B9>г<EFBFBD><D0B3><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>0-49<34>Σ<EFBFBD>
for (int i = 0; i < 3; ++i) {
for (int j = 0; j < HARMNUM; ++j) {
float_buffer.push_back(INHARMV[i][j]);
}
}
// ת<><D7AA>ΪBase64
return floatVectorToBase64(float_buffer);
}
// <20><><EFBFBD>ݽ<EFBFBD><DDBD>߷<EFBFBD>ʽѡ<CABD><D1A1>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::string ConvertToBase64(int wiringType) const {
// 1Ϊ<31><CEAA><EFBFBD>ͽ<EFBFBD><CDBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>
if (wiringType == 1) {
return ConvertToBase64_Delta();
}
else {
return ConvertToBase64_Star();
}
}
};
#pragma pack(pop)
//<2F><>̬<EFBFBD><CCAC><EFBFBD>ؽṹ------------------------------
#pragma pack(push, 1)
// ʱ<><CAB1><EFBFBD><EFBFBD><E1B9B9>
struct TagMsTime {
uint16_t Year;
uint16_t Month;
uint16_t Day;
uint16_t Hour;
uint16_t Min;
uint16_t Sec;
uint16_t Ms;
void convertByteOrder() {
Year = ntohs(Year);
Month = ntohs(Month);
Day = ntohs(Day);
Hour = ntohs(Hour);
Min = ntohs(Min);
Sec = ntohs(Sec);
Ms = ntohs(Ms);
}
};
// <20><EFBFBD>¼<EFBFBD>ͷ<EFBFBD>
struct NewHeadTaglogbuffer {
uint16_t name; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TagMsTime Devtime; // <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
uint16_t LogType; // <20><>־<EFBFBD><D6BE><EFBFBD><EFBFBD>
uint16_t LogCode; // <20><>־<EFBFBD><D6BE><EFBFBD><EFBFBD>
uint16_t LogLb; // <20><>־¼<D6BE><C2BC>
uint16_t LogBackup; // <20><>־<EFBFBD><D6BE><EFBFBD><EFBFBD>λ
uint32_t LogParaNum; // <20><>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void convertByteOrder() {
name = ntohs(name);
Devtime.convertByteOrder();
LogType = ntohs(LogType);
LogCode = ntohs(LogCode);
LogLb = ntohs(LogLb);
LogBackup = ntohs(LogBackup);
LogParaNum = ntohl(LogParaNum);
}
};
// <20><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
struct NewBodyTaglogbuffer {
uint32_t ParaCode; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint32_t ParaValue; // <20><><EFBFBD><EFBFBD>ֵ
void convertByteOrder() {
ParaCode = ntohl(ParaCode);
ParaValue = ntohl(ParaValue);
}
};
// <20><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
class NewTaglogbuffer {
public:
NewHeadTaglogbuffer head;
std::vector<NewBodyTaglogbuffer> bodyList;
// <20><><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void parseFromData(const uint8_t* data, size_t data_size) {
// <20><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>
if (data_size < sizeof(NewHeadTaglogbuffer)) {
throw std::runtime_error("Insufficient data for header");
}
memcpy(&head, data, sizeof(NewHeadTaglogbuffer));
head.convertByteOrder();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>岿<EFBFBD><E5B2BF>
const size_t body_start = sizeof(NewHeadTaglogbuffer);
const size_t body_size = head.LogParaNum * sizeof(NewBodyTaglogbuffer);
if (data_size < body_start + body_size) {
throw std::runtime_error("Insufficient data for body");
}
bodyList.resize(head.LogParaNum);
const uint8_t* body_data = data + body_start;
for (uint32_t i = 0; i < head.LogParaNum; ++i) {
memcpy(&bodyList[i], body_data, sizeof(NewBodyTaglogbuffer));
bodyList[i].convertByteOrder();
body_data += sizeof(NewBodyTaglogbuffer);
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>C#<23>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static NewTaglogbuffer createFromData(const uint8_t* data, size_t data_size) {
NewTaglogbuffer result;
result.parseFromData(data, data_size);
return result;
}
};
#pragma pack(pop)
// <20><><EFBFBD><EFBFBD>QVVRRecord<72><EFBFBD><E1B9B9>
struct QVVRRecord {
uint64_t triggerTimeMs; // <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>UTC<54><43><EFBFBD><EFBFBD>1970-01-01 00:00:00<30><30>ʼ<EFBFBD><CABC>
int nType = 0; // <20>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>ͣ<EFBFBD>0-δ֪ 1-<2D>ݽ<EFBFBD> 2-<2D><><EFBFBD><EFBFBD> 3-<2D>ж<EFBFBD> 4-˲̬
float fPersisstime = 0.0f; // <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
float fMagntitude = 0.0f; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>
float phase = 0.0f; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˲̬ʹ<CCAC>ã<EFBFBD>0-A 1-B 2-C 3-AB 4-BC 5-CA ?-ABC
float transientValue = 0.0f;// ˲<><CBB2><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD>˲̬ʹ<CCAC>ã<EFBFBD>
};
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>QVVRRecord
QVVRRecord DynamicLog_GetQVVRRecordFromLogBuffer(const std::string& strScale, uint32_t nPTType, float fPT, const NewTaglogbuffer& log);
//<2F><>̬<EFBFBD><CCAC><EFBFBD>ؽṹ-------------------------------
2025-06-13 11:29:59 +08:00
// <20><><EFBFBD>ɴ<EFBFBD>Э<EFBFBD><D0AD>ͷ<EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD>Ʊ<EFBFBD><C6B1><EFBFBD>
std::vector<unsigned char> generate_binary_message(
uint16_t msg_type,
const std::vector<unsigned char>& payload);
2025-06-13 11:29:59 +08:00
// <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD>Ʒ<EFBFBD><C6B7><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>
std::vector<unsigned char> generate_frontlogin_message(const std::string& strMac);
//<2F><><EFBFBD><EFBFBD>ѯ<EFBFBD><D1AF>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E4B1A8>
std::vector<unsigned char> generate_statequerytime_message();
//<2F><><EFBFBD><EFBFBD>ѯ<EFBFBD><D1AF>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD>
2025-07-09 10:03:37 +08:00
std::vector<unsigned char> generate_statequerystat_message(tagTime time, uint16_t nDeviceNo, uint16_t nDataType);
//<2F><><EFBFBD><EFBFBD>ѯ<EFBFBD><D1AF>ʵʱ<CAB5><CAB1><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD>
std::vector<unsigned char> generate_realstat_message(unsigned char nCpuNo, unsigned char StaTtype, unsigned char flag);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ǰ֡<C7B0><D6A1><EFBFBD><EFBFBD>+<2B>ļ<EFBFBD><C4BC><EFBFBD>
std::vector<unsigned char> generate_downloadfile_message(int frameIndex, const std::string& fileName);