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
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); // удаляем рассмотренный байт из вектора
|
||
|
}
|
||
|
}
|