public override void readPacketData(DataInputStream datainputstream) { xPosition = datainputstream.readInt(); yPosition = datainputstream.readShort(); zPosition = datainputstream.readInt(); xSize = datainputstream.read() + 1; ySize = datainputstream.read() + 1; zSize = datainputstream.read() + 1; chunkSize = datainputstream.readInt(); var abyte0 = new byte[chunkSize]; datainputstream.readFully(abyte0); chunk = new byte[(xSize * ySize * zSize * 5) / 2]; var inflater = new Inflater(); inflater.setInput(abyte0); try { inflater.inflate(chunk); } catch (DataFormatException dataformatexception) { throw new IOException("Bad compressed data format"); } finally { inflater.end(); } }
public NbtNode Read(int x, int z) { lock (this) { MoveToHeaderPosition(x, z); var index = _filePointer.ReadInt32(); if (index == 0) { return(null); // Not yet generated } int usedSectors = index & 0xFF; int sectorOffset = index >> 8; _filePointer.Seek(sectorOffset * 4096, SeekOrigin.Begin); int chunkLength = _filePointer.ReadInt32(); if (chunkLength == -1) { return(null); // Not yet generated } byte compressionMode = _filePointer.ReadByte(); MemoryStream decompressStream; if (compressionMode == 0) { } if (compressionMode == 1) { byte[] buffer = new byte[chunkLength]; _filePointer.Read(buffer, 0, buffer.Length); buffer = Decompress(buffer); decompressStream = new MemoryStream(buffer); } else { byte[] buffer = new byte[chunkLength]; _filePointer.Read(buffer, 0, buffer.Length); var def = new Inflater(); decompressStream = new MemoryStream(); def.setInput(buffer); int i = 0; buffer = new byte[1024 * 1024]; try { while (!def.finished() && (i = def.inflate(buffer)) > 0) { decompressStream.Write(buffer, 0, i); } } catch { return(null); } decompressStream.Seek(0, SeekOrigin.Begin); } return(new NbtReader().ReadNbtFile(decompressStream)); } }
public virtual int sceZlibDecompress(TPointer outBufferAddr, int outBufferLength, TPointer inBufferAddr, TPointer32 crc32Addr) { sbyte[] inBuffer = new sbyte[4096]; sbyte[] outBuffer = new sbyte[4096]; int inBufferPtr = 0; IMemoryReader reader = MemoryReader.getMemoryReader(inBufferAddr.Address, 1); IMemoryWriter writer = MemoryWriter.getMemoryWriter(outBufferAddr.Address, outBufferLength, 1); CRC32 crc32 = new CRC32(); Inflater inflater = new Inflater(); while (!inflater.finished()) { if (inflater.needsInput()) { for (inBufferPtr = 0; inBufferPtr < inBuffer.Length; ++inBufferPtr) { inBuffer[inBufferPtr] = (sbyte)reader.readNext(); } inflater.Input = inBuffer; } try { int count = inflater.inflate(outBuffer); if (inflater.TotalOut > outBufferLength) { Console.WriteLine(string.Format("sceZlibDecompress : zlib decompress buffer too small inBuffer={0}, outLength={1:D}", inBufferAddr, outBufferLength)); return(SceKernelErrors.ERROR_INVALID_SIZE); } crc32.update(outBuffer, 0, count); for (int i = 0; i < count; ++i) { writer.writeNext(outBuffer[i] & 0xFF); } } catch (DataFormatException) { Console.WriteLine(string.Format("sceZlibDecompress : malformed zlib stream inBuffer={0}", inBufferAddr)); return(SceKernelErrors.ERROR_INVALID_FORMAT); } } writer.flush(); crc32Addr.setValue((int)crc32.Value); return(inflater.TotalOut); }