/* * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * */ // LZO.Net // $Id: LZOCompressor.cs,v 1.1 2004/02/22 17:44:04 laptop Exp $ namespace Simplicit.Net.Lzo { using System; using System.Diagnostics; using System.Runtime.InteropServices; /// /// Wrapper class for the highly performant LZO compression library /// public class LZOCompressor { private static TraceSwitch _traceSwitch = new TraceSwitch("Simplicit.Net.Lzo", "Switch for tracing of the LZOCompressor-Class"); #region Dll-Imports [DllImport("lzo.dll")] private static extern int __lzo_init3(); [DllImport("lzo.dll")] private static extern string lzo_version_string(); [DllImport("lzo.dll")] private static extern string lzo_version_date(); [DllImport("lzo.dll")] private static extern int lzo1x_1_compress( byte[] src, int src_len, byte[] dst, ref int dst_len, byte[] wrkmem ); [DllImport("lzo.dll")] private static extern int lzo1x_decompress( byte[] src, int src_len, byte[] dst, ref int dst_len, byte[] wrkmem); #endregion private byte[] _workMemory = new byte[16384L * 4]; static LZOCompressor() { int init = __lzo_init3(); if(init != 0) { throw new Exception("Initialization of LZO-Compressor failed !"); } } /// /// Constructor. /// public LZOCompressor() { } /// /// Version string of the compression library. /// public string Version { get { return lzo_version_string(); } } /// /// Version date of the compression library /// public string VersionDate { get { return lzo_version_date(); } } /// /// Compresses a byte array and returns the compressed data in a new /// array. You need the original length of the array to decompress it. /// /// Source array for compression /// Byte array containing the compressed data public byte[] Compress(byte[] src) { if(_traceSwitch.TraceVerbose) { Trace.WriteLine(String.Format("LZOCompressor: trying to compress {0}", src.Length)); } byte[] dst = new byte[src.Length + src.Length / 64 + 16 + 3 + 4]; int outlen = 0; lzo1x_1_compress(src, src.Length, dst, ref outlen, _workMemory); if(_traceSwitch.TraceVerbose) { Trace.WriteLine(String.Format("LZOCompressor: compressed {0} to {1} bytes", src.Length, outlen)); } byte[] ret = new byte[outlen + 4]; Array.Copy(dst, 0, ret, 0, outlen); byte[] outlenarr = BitConverter.GetBytes(src.Length); Array.Copy(outlenarr, 0, ret, outlen, 4); return ret; } /// /// Decompresses compressed data to its original state. /// /// Source array to be decompressed /// Decompressed data public byte[] Decompress(byte[] src) { if(_traceSwitch.TraceVerbose) { Trace.WriteLine(String.Format("LZOCompressor: trying to decompress {0}", src.Length)); } int origlen = BitConverter.ToInt32(src, src.Length - 4); byte[] dst = new byte[origlen]; int outlen = origlen; lzo1x_decompress(src, src.Length - 4, dst, ref outlen, _workMemory); if(_traceSwitch.TraceVerbose) { Trace.WriteLine(String.Format("LZOCompressor: decompressed {0} to {1} bytes", src.Length, origlen)); } return dst; } } }