Files
front_linux/LFtid1056/PQSMsg.cpp

92 lines
2.5 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 "client2.h"
#include "PQSMsg.h"
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MAC<41><43>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E4B5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void GetMAC(const std::string& strMAC, std::vector<unsigned char>& packet, size_t startIndex) {
// <20>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD>пո<D0BF><D5B8>Ͷ̺<CDB6><CCBA><EFBFBD>
std::string cleanedMAC = strMAC;
cleanedMAC.erase(std::remove(cleanedMAC.begin(), cleanedMAC.end(), ' '), cleanedMAC.end());
cleanedMAC.erase(std::remove(cleanedMAC.begin(), cleanedMAC.end(), '-'), cleanedMAC.end());
// <20><>֤<EFBFBD><D6A4><EFBFBD><EFBFBD>
if (cleanedMAC.length() != 12) {
throw std::invalid_argument("MAC<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ȱ<EFBFBD><EFBFBD><EFBFBD>Ϊ12<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>");
}
try {
// <20><><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>Ϊʮ<CEAA><CAAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
for (int i = 0; i < 6; i++) {
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Ӵ<EFBFBD>
std::string byteStr = cleanedMAC.substr(i * 2, 2);
// ת<><D7AA>Ϊʮ<CEAA><CAAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD>
unsigned char byte = static_cast<unsigned char>(
std::stoi(byteStr, nullptr, 16)
);
// <20><><EFBFBD>䵽ָ<E4B5BD><D6B8>λ<EFBFBD><CEBB>
if (startIndex + i < packet.size()) {
packet[startIndex + i] = byte;
}
}
// ʣ<>ಿ<EFBFBD><E0B2BF><EFBFBD><EFBFBD>0 (<28>ܹ<EFBFBD><DCB9><EFBFBD>Ҫ64<36>ֽڣ<D6BD><DAA3><EFBFBD>MACֻռ6<D5BC>ֽ<EFBFBD>)
for (int i = 6; i < 64; i++) {
if (startIndex + i < packet.size()) {
packet[startIndex + i] = 0;
}
}
}
catch (const std::exception& e) {
throw std::invalid_argument("<EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD>MAC<EFBFBD><EFBFBD>ַ: " + std::string(e.what()));
}
}
// <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)
{
const size_t packetSize = 150; // <20><><EFBFBD><EFBFBD><EFBFBD>ܳ<EFBFBD>150 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><D6A1><EFBFBD><EFBFBD>140
std::vector<unsigned char> packet(packetSize, 0); // <20><>ʼ<EFBFBD><CABC>Ϊȫ0
// Э<><D0AD>ͷ
packet[0] = 0xEB; // <20><>ʼ<EFBFBD><CABC>־1
packet[1] = 0x90;
packet[2] = 0xEB; // <20><>ʼ<EFBFBD><CABC>־2
packet[3] = 0x90;
packet[4] = 0x8C; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5B3A4> (140 = 0x008C)
packet[5] = 0x00;
// [6-7] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>Ϊ0)
// [8-9] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>Ϊ0)
// [10-11] ֡<><D6A1><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>Ϊ0)
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1
packet[12] = 'F';
packet[13] = 'T';
packet[14] = 'I';
packet[15] = 'D';
// [16-19] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2 (<28><><EFBFBD><EFBFBD>Ϊ0)
// <20><><EFBFBD><EFBFBD>MAC<41><43>ַ (<28><>λ<EFBFBD><CEBB>20<32><30>ʼ<EFBFBD><CABC>64<36>ֽ<EFBFBD>)
GetMAC(strMac, packet, 20);
// <20><><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD> (<28><>ƫ<EFBFBD><C6AB>8<EFBFBD><38>137)
unsigned char checksum = 0;
for (size_t i = 8; i < packetSize - 2; i++) {
checksum += packet[i];
}
packet[packetSize - 2] = checksum;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
packet[packetSize - 1] = 0x16;
return packet;
}