mirror of
https://github.com/HikikoMarmy/Champions-Reborn-Server.git
synced 2026-04-05 08:59:54 -03:00
Fixed Zero Run Length Compression
This commit is contained in:
@@ -6,61 +6,60 @@
|
|||||||
|
|
||||||
namespace RLEZ
|
namespace RLEZ
|
||||||
{
|
{
|
||||||
inline std::vector<uint8_t> Decompress(const std::vector<uint8_t>& input)
|
inline std::vector<uint8_t> Decompress( const std::vector<uint8_t> &input )
|
||||||
{
|
{
|
||||||
std::vector<uint8_t> output;
|
std::vector< uint8_t > output;
|
||||||
size_t read = 0;
|
size_t read = 0;
|
||||||
|
|
||||||
while (read < input.size())
|
while( read < input.size() )
|
||||||
{
|
{
|
||||||
uint8_t byte = input[read++];
|
uint8_t byte = input[ read++ ];
|
||||||
output.push_back(byte);
|
output.push_back( byte );
|
||||||
|
|
||||||
if (byte == 0x00)
|
if( byte == 0x00 )
|
||||||
{
|
{
|
||||||
if (read >= input.size())
|
if( read >= input.size() )
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t count = input[read++];
|
uint8_t count = input[ read++ ];
|
||||||
output.insert(output.end(), count, 0x00);
|
output.insert( output.end(), count, 0x00 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline std::vector<uint8_t> Compress(const std::vector<uint8_t>& input)
|
inline std::vector<uint8_t> Compress( const std::vector<uint8_t> &input )
|
||||||
{
|
{
|
||||||
std::vector<uint8_t> output;
|
std::vector< uint8_t > output;
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
|
|
||||||
while (i < input.size())
|
while( i < input.size() )
|
||||||
{
|
{
|
||||||
if (input[i] != 0x00)
|
if( input[ i ] != 0x00 )
|
||||||
{
|
{
|
||||||
output.push_back(input[i]);
|
output.push_back( input[ i ] );
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Start of a zero run — count how many consecutive 0x00s
|
size_t zeroCount = 0;
|
||||||
size_t zeroCount = 0;
|
i++;
|
||||||
size_t start = i;
|
|
||||||
|
|
||||||
while (i < input.size() && input[i] == 0x00 && zeroCount < 255)
|
// Count all proceeding 00's
|
||||||
{
|
while( i < input.size() && input[ i ] == 0x00 && zeroCount < 255 )
|
||||||
++i;
|
{
|
||||||
++zeroCount;
|
++i;
|
||||||
}
|
++zeroCount;
|
||||||
|
}
|
||||||
|
|
||||||
// Emit zero-run marker and count (DO NOT emit any 0x00s literally)
|
output.push_back( 0x00 );
|
||||||
output.push_back(0x00);
|
output.push_back( static_cast< uint8_t >( zeroCount ) );
|
||||||
output.push_back(static_cast<uint8_t>(zeroCount));
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user