mirror of
https://github.com/SourMesen/Mesen2.git
synced 2025-04-02 10:21:44 -04:00
44 lines
No EOL
1.5 KiB
C++
44 lines
No EOL
1.5 KiB
C++
#pragma once
|
|
#include "pch.h"
|
|
#include "miniz.h"
|
|
|
|
class CompressionHelper
|
|
{
|
|
public:
|
|
static void Compress(string data, int compressionLevel, vector<uint8_t>& output)
|
|
{
|
|
unsigned long compressedSize = compressBound((unsigned long)data.size());
|
|
uint8_t* compressedData = new uint8_t[compressedSize];
|
|
compress2(compressedData, &compressedSize, (unsigned char*)data.c_str(), (unsigned long)data.size(), compressionLevel);
|
|
|
|
uint32_t size = (uint32_t)compressedSize;
|
|
uint32_t originalSize = (uint32_t)data.size();
|
|
output.insert(output.end(), (char*)&originalSize, (char*)&originalSize + sizeof(uint32_t));
|
|
output.insert(output.end(), (char*)&size, (char*)&size + sizeof(uint32_t));
|
|
output.insert(output.end(), (char*)compressedData, (char*)compressedData + compressedSize);
|
|
delete[] compressedData;
|
|
}
|
|
|
|
static bool Decompress(vector<uint8_t>& input, vector<uint8_t>& output)
|
|
{
|
|
uint32_t decompressedSize;
|
|
uint32_t compressedSize;
|
|
|
|
memcpy(&decompressedSize, input.data(), sizeof(uint32_t));
|
|
memcpy(&compressedSize, input.data() + sizeof(uint32_t), sizeof(uint32_t));
|
|
|
|
if(decompressedSize >= 1024 * 1024 * 10 || compressedSize >= 1024 * 1024 * 10) {
|
|
//Limit to 10mb the data's size
|
|
return false;
|
|
}
|
|
|
|
output.resize(decompressedSize, 0);
|
|
|
|
unsigned long decompSize = decompressedSize;
|
|
if(uncompress(output.data(), &decompSize, input.data() + sizeof(uint32_t)*2, (unsigned long)input.size() - sizeof(uint32_t) * 2) != MZ_OK) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}; |