Files
SSR/SSR/convert/DataOutputFormats.cpp
T
2026-08-05 14:37:55 +08:00

127 lines
4.2 KiB
C++

#include "DataOutputFormats.h"
#include "Psc_Cpp_Core/Base/global_include.h"
#include <cassert>
#include <chrono>
#include <string_view>
using namespace Psc;
namespace SSR {
MLAT_timestamp::MLAT_timestamp() {
std::chrono::time_point<std::chrono::high_resolution_clock> t =
std::chrono::high_resolution_clock::now();
// 获取当前的系统时间(秒)
std::chrono::duration duration_since_epoch = t.time_since_epoch();
// 获取秒数和纳秒数
auto seconds =
std::chrono::duration_cast<std::chrono::seconds>(duration_since_epoch);
auto nanoseconds = std::chrono::duration_cast<std::chrono::nanoseconds>(
duration_since_epoch);
// 获取当天的秒数和纳秒数
this->daysec = seconds.count() % 86400; // 86400 = 24 * 60 * 60 (一天的秒数)
this->nanosec = nanoseconds.count() % 86400000000000; // 1秒 = 10^9纳秒
memory = bin2mem(to_bin_string());
parse_hhmmss();
}
MLAT_timestamp::MLAT_timestamp(std::string_view memory_6) : memory(memory_6) {
assert(memory_6.size() == 6);
auto msg_bin = hex2bin(mem2hex(memory));
daysec = std::bitset<18>(msg_bin.substr(0, 18)).to_ulong();
nanosec = std::bitset<30>(msg_bin.substr(18, 30)).to_ulong();
parse_hhmmss();
PSC_ASSERT(memory_6 == bin2mem(to_bin_string()),
"MLAT_timestamp,内存转换错误!");
}
MLAT_timestamp::MLAT_timestamp(std::uint32_t daysec, std::uint32_t nanosec) : daysec(daysec), nanosec(nanosec) {
parse_hhmmss();
}
std::string MLAT_timestamp::to_bin_string() const {
std::bitset<18> daysec_bits = daysec;
std::bitset<30> nanosec_bits = nanosec;
return daysec_bits.to_string() + nanosec_bits.to_string();
}
// std::string MLAT_timestamp::to_memory() {
// return bin2memory(to_bin_string());
// }
std::string MLAT_timestamp::to_memory() const {
return memory;
}
void MLAT_timestamp::parse_hhmmss() {
hh = (daysec / 3600) % 24;
mm = (daysec / 60) % 60;
ss = daysec % 60;
}
std::string packet_to_escape_format(std::string_view t) {
std::string result = "\x1a";
for (size_t i = 1; i < t.size(); ++i) {
result.push_back(t[i]); // 插入当前字符
if (t[i] == '\x1a') {
result.push_back('\x1a'); // 如果是 0x1a,插入另一个 0x1a
}
}
return result;
}
// void Binary_Format_handle_buffer(std::string& buffer, std::string_view data, const std::function<void(std::string&)>& callback) {
// size_t i = 0;
// while (i < data.size()) {
// if (data[i] == 0x1A) {
// // 如果遇到起始标记 0x1A
// if (i + 1 < data.size() && data[i + 1] == 0x1A) {
// // 如果是转义的 0x1A 0x1A,继续处理
// buffer.push_back(0x1A); // 添加一个正常的 0x1A 字节
// i += 2; // 跳过这两个字节
// }
// else {
// // 检测到起始标记 0x1A,认为是新消息的开始
// if (!buffer.empty()) {
// // 如果当前消息 buffer 中已有数据,调用回调函数处理当前消息
// callback(buffer);
// buffer.clear(); // 清空当前消息的缓存
// }
// buffer.push_back(0x1A);
// // 跳过当前的 SOP 标记 (0x1A)
// i++;
// }
// }
// else {
// // 如果不是 0x1A,直接将数据添加到 buffer 中
// buffer.push_back(data[i]);
// i++;
// }
// }
// }
void Binary_Format_handle_buffer(std::string& buffer, std::string_view data_view, const std::function<void(std::string&)>& callback) {
constexpr char sop = 0x1A;
buffer.reserve(buffer.size() + data_view.size());
std::size_t i = 0;
while (i < data_view.size()) {
auto pos = data_view.find(sop, i);
if (pos == std::string_view::npos) {
buffer.append(data_view.data() + i, data_view.size() - i);
break;
}
buffer.append(data_view.data() + i, pos - i);
if (pos + 1 < data_view.size() && data_view[pos + 1] == sop) {
buffer.push_back(sop);
i = pos + 2;
continue;
}
if (!buffer.empty()) {
callback(buffer);
buffer.clear();
}
buffer.push_back(sop);
i = pos + 1;
}
}
// 9 + 2
// 9 + 7
// 9 + 14
std::string mode_s_msg_packet_to_server_packet(std::uint32_t id,
std::string_view packet) {
std::string id_code = Psc::platform_2_big_endian((char*)&id, sizeof(id));
PSC_ASSERT(id_code.size() == 4, "id.size != 4");
std::string result(packet);
result.insert(1, id_code.c_str(), 4);
return result;
}
}