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));
            }
        }
示例#2
0
        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);
        }