Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.IO;
namespace example
{
public partial class Form1 : Form
{
enum CompressionMethods {
// decompressors
COMP_NONE = 0, // No compression
COMP_ZLIB, // RFC 1950
COMP_DEFLATE, // RFC 1951
COMP_LZO1, // LZO 1 Freeware
COMP_LZO1A, // LZO 1a Freeware
COMP_LZO1B, // LZO 1b (safe with overrun) Freeware
COMP_LZO1C, // LZO 1c (safe with overrun) Freeware
COMP_LZO1F, // LZO 1f (safe with overrun) Freeware
COMP_LZO1X, // LZO 1x (safe with overrun) Freeware
COMP_LZO1Y, // LZO 1y (safe with overrun) Freeware
COMP_LZO1Z, // LZO 1z (safe with overrun) Freeware
COMP_LZO2A, // LZO 2a (safe with overrun) Freeware
COMP_LZOPRO1X, // LZOPRO 1x (safe with overrun) Freeware
COMP_LZOPRO1Y, // LZOPRO 1y (safe with overrun) Freeware
// compressors
COMP_LZO1_COMPRESS, // LZO 1 Freeware
COMP_LZO1_99_COMPRESS, // better compression ratio at the cost of more memory and time
COMP_LZO1A_COMPRESS, // LZO 1a Freeware
COMP_LZO1A_99_COMPRESS, // better compression ratio at the cost of more memory and time
COMP_LZO1B_COMPRESS, // LZO 1b Freeware (Valid compression level: 1..9)
COMP_LZO1B_99_COMPRESS, // better compression ratio at the cost of more memory and time
COMP_LZO1B_999_COMPRESS,// even better compression ratio at the cost of more memory and time
COMP_LZO1C_COMPRESS, // LZO 1c Freeware (Valid compression level: 1..9)
COMP_LZO1C_99_COMPRESS, // better compression ratio at the cost of more memory and time
COMP_LZO1C_999_COMPRESS,// even better compression ratio at the cost of more memory and time
COMP_LZO1F_COMPRESS, // LZO 1f Freeware
COMP_LZO1F_999_COMPRESS,// even better compression ratio at the cost of more memory and time
COMP_LZO1X_COMPRESS, // LZO 1x Freeware
COMP_LZO1X_999_COMPRESS,// even better compression ratio at the cost of more memory and time
COMP_LZO1Y_COMPRESS, // LZO 1y Freeware
COMP_LZO1Y_999_COMPRESS,// even better compression ratio at the cost of more memory and time
COMP_LZO1Z_COMPRESS, // LZO 1z Freeware
COMP_LZO1Z_999_COMPRESS,// even better compression ratio at the cost of more memory and time
COMP_LZO2A_COMPRESS, // LZO 2a Freeware
COMP_LZO2A_999_COMPRESS, // even better compression ratio at the cost of more memory and time
COMP_LZOPRO1X_COMPRESS, // LZOPRO 1x (Valid compression level: 1..10)
COMP_LZOPRO1Y_COMPRESS, // LZOPRO 1y (Valid compression level: 1..10)
}
public byte[] ReadAllBytes(string fileName, int offset)
{
byte[] buffer = null;
using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
//Console.Out.WriteLine("fs.Length: " + fs.Length + "\n");
//Console.Out.WriteLine("offset: " + offset + "\n");
buffer = new byte[(fs.Length - offset)];
fs.Seek(offset, SeekOrigin.Begin);
fs.Read(buffer, 0, (int)(fs.Length - offset));
}
return buffer;
}
public Form1()
{
InitializeComponent();
}
[DllImport("compress.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern uint lzo_decompress([Out] byte[] compressed_buffer, uint compressed_size, [In] byte[] decompressed_buffer, uint decompressed_size, uint method);
[DllImport("compress.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern uint lzo_compress([Out] byte[] decompressed_buffer, uint decompressed_size, [In] byte[] compressed_buffer, uint compressed_size, uint method, uint compress_level);
private void button1_Click(object sender, EventArgs e)
{
string Pfad = string.Empty;
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.Filter = "Save (*.sav)|*.sav|All files (*.*)|*.*";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
Pfad = openFileDialog1.FileName;
UInt32 decompressed_size = 24875; // Static for now on my testfile
byte[] decompressed_buffer = new byte[decompressed_size];
byte[] compressed_buffer = ReadAllBytes(Pfad, 0x18);
uint compressed_size = (uint)compressed_buffer.Length;
uint result = lzo_decompress(compressed_buffer, compressed_size, decompressed_buffer, decompressed_size, (uint)CompressionMethods.COMP_LZOPRO1X);
richTextBox1.Text += "\nDecompress result: " + result + "\n";
for (int i = 0; i < 128; i++)
richTextBox1.Text += decompressed_buffer[i].ToString("X2");
decompressed_size = result;
result = lzo_compress(decompressed_buffer, decompressed_size, compressed_buffer, compressed_size, (uint)CompressionMethods.COMP_LZOPRO1X_COMPRESS, 10);
richTextBox1.Text += "\nCompress result: " + result + "\n";
for (int i = 0; i < 128; i++)
richTextBox1.Text += compressed_buffer[i].ToString("X2");
/*
for (int i = 0; i < result; i++)
richTextBox1.Text += decompressed_buffer[i].ToString("X2");
*/
}
}
}