|
■No99981 (さや さん) に返信 > まずは教えていただいたMemoryStreamを使って引数をバイナリーデータにして、元のソースに組み込んでみたいと思います。
.zip や .7z ファイルを作ることが目的なのでは無く、 LZMA ストリームとしてのデータの圧縮・解凍が主目的でしょうか? (LZMA SDK の LZMA ストリームと 7-Zip は非互換という認識です)
となれば、CRC ハッシュやファイルリスト等も不要でしょうし、 圧縮は、SevenZip.Compression.LZMA.Encoder クラスの Code メソッド 展開は、SevenZip.Compression.LZMA.Decoder クラスの Code メソッド を呼ぶところを主軸として真似ていけば良いかと思います。
■No99975 (さや さん) に返信 > この中にあるC#のサンプルがファイルを引数で渡して圧縮しており、 LzmaAlone.cs のことですかね。 本質的には Encoder / Decoder の基本部分だけ真似れば良い気がします。
とりあえず、byte[] で受け渡せるようにしてみました。 エンドマーカーや辞書サイズ等は、適宜調整してみてください。
public static byte[] CompressLZMA(byte[] rawBinary) { var encoder = new SevenZip.Compression.LZMA.Encoder(); encoder.SetCoderProperties(propIDs, properties); using (var outMem = new System.IO.MemoryStream()) using (var writer = new System.IO.BinaryWriter(outMem)) using (var inMem = new System.IO.MemoryStream(rawBinary)) { encoder.WriteCoderProperties(outMem); writer.Write(System.Net.IPAddress.HostToNetworkOrder(rawBinary.LongLength)); encoder.Code(inMem, outMem, rawBinary.LongLength, -1L, null); outMem.Flush(); return outMem.ToArray(); } }
public static byte[] DecompressLZMA(byte[] compressedBinary) { var decoder = new SevenZip.Compression.LZMA.Decoder(); using (var outMem = new System.IO.MemoryStream()) using (var inMem = new System.IO.MemoryStream(compressedBinary)) using (var reader = new System.IO.BinaryReader(inMem)) { byte[] properties = reader.ReadBytes(5); long fileLength = System.Net.IPAddress.NetworkToHostOrder(reader.ReadInt64());
decoder.SetDecoderProperties(properties); decoder.Code(inMem, outMem, compressedBinary.LongLength, fileLength, null); outMem.Flush(); return outMem.ToArray(); } }
// ジェネリックな OrderedDictionary が欲しいところ private static readonly SevenZip.CoderPropID[] propIDs = { SevenZip.CoderPropID.DictionarySize, SevenZip.CoderPropID.PosStateBits, SevenZip.CoderPropID.LitContextBits, SevenZip.CoderPropID.LitPosBits, SevenZip.CoderPropID.Algorithm, SevenZip.CoderPropID.NumFastBytes, SevenZip.CoderPropID.MatchFinder, SevenZip.CoderPropID.EndMarker, }; private static readonly object[] properties = { (int)(1 << 23), // Dictionary Size (int)2, // postion state bit (0〜4) (int)3, // literal context bits (0〜8) (int)0, // literal position bits (0〜4) (int)2, // algorithm (int)128, // fast bytes for LZ* "bt4", // match finder ("BT2", "BT4", "BT4B") false // end marker };
|