void szReadStreamsInfo(SzData sd, out ulong dataOffset, ArchiveDatabase db, out uint numUnPackStreams, out ulong[] unPackSizes, out bool[]packCRCsDefined, out uint[] packCRCs) { //Console.WriteLine("szReadStreamsInfo >>>"); numUnPackStreams = 0; unPackSizes = null; packCRCsDefined = null; packCRCs = null; dataOffset = 0; while (true) { EIdEnum type = szReadID(sd ); //Console.WriteLine( "ReadStreamsInfox, got type: " + type); switch (type) { case EIdEnum.k7zIdEnd: return; case EIdEnum.k7zIdPackInfo: //Console.WriteLine("calling szReadPackInfo..."); szReadPackInfo(sd, out dataOffset, out db.NumPackStreams, out db.PackSizes, out db.PackCRCsDefined, out db.PackCRCs); //Console.WriteLine("szReadStreamsInfo, crc info: "); break; case EIdEnum.k7zIdUnPackInfo: szReadUnPackInfo(sd,out db.NumFolders, out db.Folders ); break; case EIdEnum.k7zIdSubStreamsInfo: szReadSubStreamsInfo(sd, db.Folders, out numUnPackStreams, out unPackSizes, out packCRCsDefined, out packCRCs ); //RINOK(SzReadSubStreamsInfo(sd, db->NumFolders, db->Folders, // numUnPackStreams, unPackSizes, digestsDefined, digests, allocTemp)); break; default: throw new Exception("Unexpected type in szReadStreamsInfo " + type); } } //Console.WriteLine("szReadStreamsInfo <<<"); }
void SzReadAndDecodePackedStreams2( FileStream inStream, SzData sd, out byte[] outBuffer, ulong baseOffset, ArchiveDatabase db, out ulong[] unPackSizes, out bool[] digestsDefined, out uint[] digests ) { uint numUnPackStreams = 0; ulong dataStartPos = 0; Folder folder; ulong unPackSize; //ulong outRealSize; ulong packSize = 0; //uint i = 0; outBuffer = null; szReadStreamsInfo(sd, out dataStartPos, db, out numUnPackStreams, out unPackSizes, out digestsDefined, out digests); //RINOK(SzReadStreamsInfo(sd, &dataStartPos, db, //&numUnPackStreams, unPackSizes, digestsDefined, digests, //allocTemp->Alloc, allocTemp)); dataStartPos += baseOffset; if (db.NumFolders != 1) { throw new Exception("db.NumFolders value unexpected: " + db.NumFolders); } folder = db.Folders[0]; unPackSize = folder.GetUnPackSize(); //Console.WriteLine("datastartpos : " + dataStartPos); inStream.Seek((long)dataStartPos, SeekOrigin.Begin); //#ifndef _LZMA_IN_CB for (uint i = 0; i < db.NumPackStreams; i++) packSize += db.PackSizes[i]; //Console.WriteLine("packsize: " + packSize); //RINOK(MySzInAlloc((void **)inBuffer, (size_t)packSize, allocTemp->Alloc)); //RINOK(SafeReadDirect(inStream, *inBuffer, (size_t)packSize)); //#endif outBuffer = new byte[unPackSize]; //if (!SzByteBufferCreate(outBuffer, (size_t)unPackSize, allocTemp->Alloc)) // return SZE_OUTOFMEMORY; byte[]inbuffer = new byte[ packSize ]; inStream.Read( inbuffer, 0, (int)packSize ); //Console.WriteLine("NumCoders: " + ( folder.Coders.GetUpperBound(0) + 1 )); //Console.WriteLine("Coder: " + folder.Coders[0]); //Console.WriteLine("Coder num properties: " + folder.Coders[0].Properties.GetUpperBound(0) + 1); //DumpBytes(folder.Coders[0].Properties, folder.Coders[0].Properties.GetUpperBound(0) + 1); inStream.Seek((long)dataStartPos, SeekOrigin.Begin); //byte[] properties = new byte[5]; //inStream.Read(properties, 0, 5); Compression.LZMA.Decoder decoder = new SevenZip.Compression.LZMA.Decoder(); decoder.SetDecoderProperties(folder.Coders[0].Properties); MemoryStream outStream = new MemoryStream(outBuffer); decoder.Code(inStream, outStream, (long)( packSize - 5 ), (long)unPackSize, null); outStream.Close(); //DumpBytes(outBuffer, (int)unPackSize); //Console.WriteLine(outBuffer.GetUpperBound(0) + 1); //for (ulong i = 0; i < unPackSize; i++) //{ // Console.WriteLine( (char)outBuffer[i]); //} //SzDecode(db.PackSizes, folder, //#ifdef _LZMA_IN_CB // inStream, //#else //*inBuffer, //#endif // outBuffer, unPackSize, // out outRealSize); //if (outRealSize != (uint)unPackSize) //{ // throw new Exception("OutRealSize != unPackSize " + outRealSize + " vs " + unPackSize); //} //if (folder.UnPackCRCDefined) //{ // note to self: to do //if (!CrcVerifyDigest(folder->UnPackCRC, outBuffer->Items, (size_t)unPackSize)) //{ // return SZE_FAIL; //} //} }
void szReadAndDecodePackedStreams( FileStream inStream, SzData sd, out byte[] outBuffer, ulong baseOffset) { ArchiveDatabase db = new ArchiveDatabase(); ulong[] unPackSizes; bool[] digestsDefined; uint[] digests; SzReadAndDecodePackedStreams2(inStream, sd, out outBuffer, baseOffset, db, out unPackSizes, out digestsDefined, out digests); }