mirror of
https://github.com/HikikoMarmy/Champions-Reborn-Server.git
synced 2026-04-05 08:59:54 -03:00
Run-length zero compression for RTA.
This commit is contained in:
66
Common/RLEZ.hpp
Normal file
66
Common/RLEZ.hpp
Normal file
@@ -0,0 +1,66 @@
|
||||
#pragma once
|
||||
|
||||
#include <vector>
|
||||
#include <stdexcept>
|
||||
#include <cstdint>
|
||||
|
||||
namespace RLEZ
|
||||
{
|
||||
inline std::vector<uint8_t> Decompress(const std::vector<uint8_t>& input)
|
||||
{
|
||||
std::vector<uint8_t> output;
|
||||
size_t read = 0;
|
||||
|
||||
while (read < input.size())
|
||||
{
|
||||
uint8_t byte = input[read++];
|
||||
output.push_back(byte);
|
||||
|
||||
if (byte == 0x00)
|
||||
{
|
||||
if (read >= input.size())
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
uint8_t count = input[read++];
|
||||
output.insert(output.end(), count, 0x00);
|
||||
}
|
||||
}
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
inline std::vector<uint8_t> Compress(const std::vector<uint8_t>& input)
|
||||
{
|
||||
std::vector<uint8_t> output;
|
||||
size_t i = 0;
|
||||
|
||||
while (i < input.size())
|
||||
{
|
||||
if (input[i] != 0x00)
|
||||
{
|
||||
output.push_back(input[i]);
|
||||
++i;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Start of a zero run — count how many consecutive 0x00s
|
||||
size_t zeroCount = 0;
|
||||
size_t start = i;
|
||||
|
||||
while (i < input.size() && input[i] == 0x00 && zeroCount < 255)
|
||||
{
|
||||
++i;
|
||||
++zeroCount;
|
||||
}
|
||||
|
||||
// Emit zero-run marker and count (DO NOT emit any 0x00s literally)
|
||||
output.push_back(0x00);
|
||||
output.push_back(static_cast<uint8_t>(zeroCount));
|
||||
}
|
||||
}
|
||||
|
||||
return output;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user