1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- using System;
- using System.IO;
- using SevenZip;
- using SevenZip.Compression.LZMA;
- namespace Util
- {
- internal static class LZMA
- {
- private static readonly CoderPropID[] PropIDs =
- {
- CoderPropID.DictionarySize,
- CoderPropID.PosStateBits,
- CoderPropID.LitContextBits,
- CoderPropID.LitPosBits,
- CoderPropID.Algorithm,
- CoderPropID.NumFastBytes,
- CoderPropID.MatchFinder,
- CoderPropID.EndMarker
- };
- private static readonly object[] Properties =
- {
- 1 << 23,
- 2,
- 3,
- 0,
- 2,
- 128,
- "bt4",
- false
- };
- public static byte[] Compress(MemoryStream inStream)
- {
- MemoryStream outStream = new MemoryStream();
- Encoder encoder = new Encoder();
- encoder.SetCoderProperties(PropIDs, Properties);
- encoder.WriteCoderProperties(outStream);
- Int64 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 MemoryStream Decompress(Stream inStream)
- {
- MemoryStream outStream = new MemoryStream();
- byte[] properties = new byte[5];
- if (inStream.Read(properties, 0, 5) != 5)
- {
- throw new Exception("input .lzma is too short");
- }
- Decoder decoder = new Decoder();
- decoder.SetDecoderProperties(properties);
- long outSize = 0;
- for (int i = 0; i < 8; i++)
- {
- int v = inStream.ReadByte();
- if (v < 0)
- {
- throw new Exception("Can't Read 1");
- }
- outSize |= ((long)(byte)v) << (8 * i);
- }
- long compressedSize = inStream.Length - inStream.Position;
- decoder.Code(inStream, outStream, compressedSize, outSize, null);
- return outStream;
- }
- }
- }
|