public object[] Deserialize(Stream readStream, Type[] types, string[] names) { var reader = new BinaryReader(readStream); var argLenth = reader.ReadByte(); var args = new object[argLenth]; for (int i = 0; i < argLenth; i++) { var itemType = types[i]; if (typeof(Stream).IsAssignableFrom(itemType)) { //TODO: large stream write to temp file, small size stream write to memory stream var tempFs = new TempFileStream(Path.GetTempFileName(), FileMode.Create); int loop = 0; while (true) { var buff = (byte[])RuntimeTypeModel.Default.DeserializeWithLengthPrefix(readStream, null, typeof(byte[]), ProtoBuf.PrefixStyle.Base128, args.Length + i * loop); if (buff.Length == 0) { tempFs.Position = 0; break; } tempFs.Write(buff, 0, buff.Length); loop++; } args[i] = tempFs; } else { args[i] = RuntimeTypeModel.Default.DeserializeWithLengthPrefix(readStream, null, itemType, ProtoBuf.PrefixStyle.Base128, i); } } return(args); }
public void Read(Stream str) { this.Entries.Clear(); BigEndianBinaryReader bigEndianBinaryReader = new BigEndianBinaryReader(str); this.header.MagicNumber = bigEndianBinaryReader.ReadUInt32(); this.header.VersionNumber = bigEndianBinaryReader.ReadUInt32(); this.header.CompressionMethod = bigEndianBinaryReader.ReadUInt32(); this.header.TotalTOCSize = bigEndianBinaryReader.ReadUInt32(); this.header.TOCEntrySize = bigEndianBinaryReader.ReadUInt32(); this.header.numFiles = bigEndianBinaryReader.ReadUInt32(); this.header.blockSize = bigEndianBinaryReader.ReadUInt32(); this.header.archiveFlags = bigEndianBinaryReader.ReadUInt32(); var tocStream = str; BigEndianBinaryReader bigEndianBinaryReaderTOC = bigEndianBinaryReader; if (this.header.archiveFlags == 4) { var decStream = new TempFileStream(); using (var outputStream = new MemoryStream()) { RijndaelEncryptor.DecryptPSARC(str, outputStream, this.header.TotalTOCSize); int bytesRead; byte[] buffer = new byte[30000]; int decMax = (int)this.header.TotalTOCSize - 32; int decSize = 0; outputStream.Seek(0, SeekOrigin.Begin); while ((bytesRead = outputStream.Read(buffer, 0, buffer.Length)) > 0) { decSize += bytesRead; if (decSize > decMax) bytesRead = decMax - (decSize - bytesRead); decStream.Write(buffer, 0, bytesRead); } } decStream.Seek(0, SeekOrigin.Begin); str.Seek(this.header.TotalTOCSize, SeekOrigin.Begin); tocStream = decStream; bigEndianBinaryReaderTOC = new BigEndianBinaryReader(tocStream); } if (this.header.MagicNumber == 1347633490) { if (this.header.CompressionMethod == 2053925218) { byte b = 1; uint num = 256; do { num *= 256; b += 1; } while (num < this.header.blockSize); int num2 = 0; while (num2 < this.header.numFiles) { this.Entries.Add(new Entry { id = num2, MD5 = bigEndianBinaryReaderTOC.ReadBytes(16), zIndex = bigEndianBinaryReaderTOC.ReadUInt32(), Length = bigEndianBinaryReaderTOC.ReadUInt40(), Offset = bigEndianBinaryReaderTOC.ReadUInt40() }); num2++; } long decMax = (this.header.archiveFlags == 4) ? 32 : 0; uint num3 = (this.header.TotalTOCSize - (uint)(tocStream.Position + decMax)) / (uint)b; uint[] array = new uint[num3]; num2 = 0; while (num2 < num3) { switch (b) { case 2: array[num2] = (uint)bigEndianBinaryReaderTOC.ReadUInt16(); break; case 3: array[num2] = bigEndianBinaryReaderTOC.ReadUInt24(); break; case 4: array[num2] = bigEndianBinaryReaderTOC.ReadUInt32(); break; } num2++; } this.inflateEntries(bigEndianBinaryReader, array.ToArray<uint>(), this.header.blockSize); this.ReadNames(); } } //str.Flush(); }
public void Read(Stream str) { this.Entries.Clear(); BigEndianBinaryReader bigEndianBinaryReader = new BigEndianBinaryReader(str); this.header.MagicNumber = bigEndianBinaryReader.ReadUInt32(); this.header.VersionNumber = bigEndianBinaryReader.ReadUInt32(); this.header.CompressionMethod = bigEndianBinaryReader.ReadUInt32(); this.header.TotalTOCSize = bigEndianBinaryReader.ReadUInt32(); this.header.TOCEntrySize = bigEndianBinaryReader.ReadUInt32(); this.header.numFiles = bigEndianBinaryReader.ReadUInt32(); this.header.blockSize = bigEndianBinaryReader.ReadUInt32(); this.header.archiveFlags = bigEndianBinaryReader.ReadUInt32(); var tocStream = str; BigEndianBinaryReader bigEndianBinaryReaderTOC = bigEndianBinaryReader; if (this.header.archiveFlags == 4) { var decStream = new TempFileStream(); using (var outputStream = new MemoryStream()) { RijndaelEncryptor.DecryptPSARC(str, outputStream, this.header.TotalTOCSize); int bytesRead; byte[] buffer = new byte[30000]; int decMax = (int)this.header.TotalTOCSize - 32; int decSize = 0; outputStream.Seek(0, SeekOrigin.Begin); while ((bytesRead = outputStream.Read(buffer, 0, buffer.Length)) > 0) { decSize += bytesRead; if (decSize > decMax) { bytesRead = decMax - (decSize - bytesRead); } decStream.Write(buffer, 0, bytesRead); } } decStream.Seek(0, SeekOrigin.Begin); str.Seek(this.header.TotalTOCSize, SeekOrigin.Begin); tocStream = decStream; bigEndianBinaryReaderTOC = new BigEndianBinaryReader(tocStream); } if (this.header.MagicNumber == 1347633490) { if (this.header.CompressionMethod == 2053925218) { byte b = 1; uint num = 256; do { num *= 256; b += 1; }while (num < this.header.blockSize); int num2 = 0; while (num2 < this.header.numFiles) { this.Entries.Add(new Entry { id = num2, MD5 = bigEndianBinaryReaderTOC.ReadBytes(16), zIndex = bigEndianBinaryReaderTOC.ReadUInt32(), Length = bigEndianBinaryReaderTOC.ReadUInt40(), Offset = bigEndianBinaryReaderTOC.ReadUInt40() }); num2++; } long decMax = (this.header.archiveFlags == 4) ? 32 : 0; uint num3 = (this.header.TotalTOCSize - (uint)(tocStream.Position + decMax)) / (uint)b; uint[] array = new uint[num3]; num2 = 0; while (num2 < num3) { switch (b) { case 2: array[num2] = (uint)bigEndianBinaryReaderTOC.ReadUInt16(); break; case 3: array[num2] = bigEndianBinaryReaderTOC.ReadUInt24(); break; case 4: array[num2] = bigEndianBinaryReaderTOC.ReadUInt32(); break; } num2++; } this.inflateEntries(bigEndianBinaryReader, array.ToArray <uint>(), this.header.blockSize); this.ReadNames(); } } str.Flush(); }