Kelsidavis-WoWee/src/network/packet.cpp

96 lines
2.2 KiB
C++

#include "network/packet.hpp"
#include <cstring>
namespace wowee {
namespace network {
Packet::Packet(uint16_t opcode) : opcode(opcode) {}
Packet::Packet(uint16_t opcode, const std::vector<uint8_t>& data)
: opcode(opcode), data(data), readPos(0) {}
void Packet::writeUInt8(uint8_t value) {
data.push_back(value);
}
void Packet::writeUInt16(uint16_t value) {
data.push_back(value & 0xFF);
data.push_back((value >> 8) & 0xFF);
}
void Packet::writeUInt32(uint32_t value) {
data.push_back(value & 0xFF);
data.push_back((value >> 8) & 0xFF);
data.push_back((value >> 16) & 0xFF);
data.push_back((value >> 24) & 0xFF);
}
void Packet::writeUInt64(uint64_t value) {
writeUInt32(value & 0xFFFFFFFF);
writeUInt32((value >> 32) & 0xFFFFFFFF);
}
void Packet::writeFloat(float value) {
uint32_t bits = 0;
std::memcpy(&bits, &value, sizeof(float));
writeUInt32(bits);
}
void Packet::writeString(const std::string& value) {
for (char c : value) {
data.push_back(static_cast<uint8_t>(c));
}
data.push_back(0); // Null terminator
}
void Packet::writeBytes(const uint8_t* bytes, size_t length) {
data.insert(data.end(), bytes, bytes + length);
}
uint8_t Packet::readUInt8() {
if (readPos >= data.size()) return 0;
return data[readPos++];
}
uint16_t Packet::readUInt16() {
uint16_t value = 0;
value |= readUInt8();
value |= (readUInt8() << 8);
return value;
}
uint32_t Packet::readUInt32() {
uint32_t value = 0;
value |= readUInt8();
value |= (readUInt8() << 8);
value |= (readUInt8() << 16);
value |= (readUInt8() << 24);
return value;
}
uint64_t Packet::readUInt64() {
uint64_t value = readUInt32();
value |= (static_cast<uint64_t>(readUInt32()) << 32);
return value;
}
float Packet::readFloat() {
// Read as uint32 and reinterpret as float
uint32_t bits = readUInt32();
float value;
std::memcpy(&value, &bits, sizeof(float));
return value;
}
std::string Packet::readString() {
std::string result;
while (readPos < data.size()) {
uint8_t c = data[readPos++];
if (c == 0) break;
result += static_cast<char>(c);
}
return result;
}
} // namespace network
} // namespace wowee