Last active
May 26, 2019 15:14
-
-
Save andrew-raphael-lukasik/1224668478f965d9c09dbeed322e7a70 to your computer and use it in GitHub Desktop.
http://www.nullskull.com/a/768/7zip-lzma-inmemory-compression-with-c.aspx /n https://www.splinter.com.au/compressing-using-the-7zip-lzma-algorithm-in/
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.IO; | |
namespace SevenZip.Compression.LZMA | |
{ | |
public static class SevenZipHelper | |
{ | |
static int dictionary = 1 << 23; | |
// static Int32 posStateBits = 2; | |
// static Int32 litContextBits = 3; // for normal files | |
// UInt32 litContextBits = 0; // for 32-bit data | |
// static Int32 litPosBits = 0; | |
// UInt32 litPosBits = 2; // for 32-bit data | |
// static Int32 algorithm = 2; | |
// static Int32 numFastBytes = 128; | |
static bool eos = false; | |
static CoderPropID[] propIDs = | |
{ | |
CoderPropID.DictionarySize, | |
CoderPropID.PosStateBits, | |
CoderPropID.LitContextBits, | |
CoderPropID.LitPosBits, | |
CoderPropID.Algorithm, | |
CoderPropID.NumFastBytes, | |
CoderPropID.MatchFinder, | |
CoderPropID.EndMarker | |
}; | |
// these are the default properties, keeping it simple for now: | |
static object[] properties = | |
{ | |
(Int32)(dictionary), | |
(Int32)(2), | |
(Int32)(3), | |
(Int32)(0), | |
(Int32)(2), | |
(Int32)(128), | |
"bt4", | |
eos | |
}; | |
public static byte[] Compress(byte[] inputBytes) | |
{ | |
MemoryStream inStream = new MemoryStream(inputBytes); | |
MemoryStream outStream = new MemoryStream(); | |
SevenZip.Compression.LZMA.Encoder encoder = new SevenZip.Compression.LZMA.Encoder(); | |
encoder.SetCoderProperties(propIDs, properties); | |
encoder.WriteCoderProperties(outStream); | |
long fileSize = inStream.Length; | |
for (int i = 0; i < 8; i++) | |
outStream.WriteByte((Byte)(fileSize >> (8 * i))); | |
encoder.Code(inStream, outStream, -1, -1, null); | |
return outStream.ToArray(); | |
} | |
public static byte[] Decompress(byte[] inputBytes) | |
{ | |
MemoryStream newInStream = new MemoryStream(inputBytes); | |
SevenZip.Compression.LZMA.Decoder decoder = new SevenZip.Compression.LZMA.Decoder(); | |
newInStream.Seek(0, 0); | |
MemoryStream newOutStream = new MemoryStream(); | |
byte[] properties2 = new byte[5]; | |
if (newInStream.Read(properties2, 0, 5) != 5) | |
throw (new Exception("input .lzma is too short")); | |
long outSize = 0; | |
for (int i = 0; i < 8; i++) | |
{ | |
int v = newInStream.ReadByte(); | |
if (v < 0) | |
throw (new Exception("Can't Read 1")); | |
outSize |= ((long)(byte)v) << (8 * i); | |
} | |
decoder.SetDecoderProperties(properties2); | |
long compressedSize = newInStream.Length - newInStream.Position; | |
decoder.Code(newInStream, newOutStream, compressedSize, outSize, null); | |
byte[] b = newOutStream.ToArray(); | |
return b; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment