示例#1
0
 public static NbtCompression ToNbtCompression(this ChunkCompressionType type)
 {
     if (type == ChunkCompressionType.GZip)
     {
         return(NbtCompression.GZip);
     }
     if (type == ChunkCompressionType.ZLib)
     {
         return(NbtCompression.ZLib);
     }
     return(NbtCompression.AutoDetect);
 }
示例#2
0
        public ChunkData(Stream stream, ChunkLocation location)
        {
            byte[] loadBuffer = new byte[location.SectorCount * 4096];
            stream.Seek(location.Offset * 4096, SeekOrigin.Begin);
            stream.Read(loadBuffer, 0, loadBuffer.Length);

            // Javaのビッグエンディアンで記述されている為必要なら反転
            if (BitConverter.IsLittleEndian)
            {
                Array.Reverse(loadBuffer, 0, 4);
            }
            uint dataLength = BitConverter.ToUInt32(loadBuffer, 0);

            // 直前に反転させた場合念のため元に戻す
            if (BitConverter.IsLittleEndian)
            {
                Array.Reverse(loadBuffer, 0, 4);
            }

            if (1 == loadBuffer[4])
            {
                CompressionType = ChunkCompressionType.GZip;
            }
            else if (2 == loadBuffer[4])
            {
                CompressionType = ChunkCompressionType.Zlib;
            }
            else
            {
                throw new InvalidDataException("Unknown chunk compression type.");
            }

            // length(4byte), 圧縮方式(1byte), RFC1950ヘッダ(2byte:0x789C)をスキップしたデータを渡す
            // lengthは圧縮方式とRFC1950ヘッダも含む為3byte減らす
            chunkNBTBinary = Decompress(loadBuffer, 7, (int)dataLength - 3, CompressionType);

            // キャッシュへ登録
            cacheCompressData = new byte[dataLength - 3];
            Buffer.BlockCopy(loadBuffer, 7, cacheCompressData, 0, cacheCompressData.Length);
            doUseCache = true;

#if DEBUG
            originalSectorDump = loadBuffer;
#endif
        }
示例#3
0
        public byte[] Compress(byte[] rawData, int offset, int length, ChunkCompressionType compressType)
        {
            if (null == rawData)
            {
                throw new ArgumentNullException("データがぬるぬるしてるよ");
            }

            if (doUseCache)
            {
                return(cacheCompressData.ToArray());
            }

            byte[] result;

            using (MemoryStream compressDataStream = new MemoryStream())
            {
                Stream compressStream;
                if (compressType == ChunkCompressionType.GZip)
                {
                    compressStream = new GZipStream(compressDataStream, CompressionMode.Compress);
                }
                else if (compressType == ChunkCompressionType.Zlib)
                {
                    compressStream = new DeflateStream(compressDataStream, CompressionMode.Compress);
                }
                else
                {
                    throw new InvalidDataException("Unknown chunk compression type.");
                }

                compressStream.Write(rawData, offset, length);
                compressStream.Close();

                result = compressDataStream.ToArray();

                cacheCompressData = result.ToArray();
                doUseCache        = true;
            }

            return(result);
        }
示例#4
0
        public byte[] Decompress(byte[] compressData, int offset, int length, ChunkCompressionType compressType)
        {
            if (null == compressData)
            {
                throw new ArgumentNullException("データがぬるぬるしてるよ");
            }

            byte[] result;

            using (MemoryStream compressDataStream = new MemoryStream(compressData, offset, length, false))
            {
                Stream decompressStream;
                if (compressType == ChunkCompressionType.GZip)
                {
                    decompressStream = new GZipStream(compressDataStream, CompressionMode.Decompress);
                }
                else if (compressType == ChunkCompressionType.Zlib)
                {
                    decompressStream = new DeflateStream(compressDataStream, CompressionMode.Decompress);
                }
                else
                {
                    throw new InvalidDataException("Unknown chunk compression type.");
                }

                using (MemoryStream rawDataStream = new MemoryStream())
                {
                    byte[] readBuffer = new byte[4096];
                    int    readBytes;
                    while (0 != (readBytes = decompressStream.Read(readBuffer, 0, readBuffer.Length)))
                    {
                        rawDataStream.Write(readBuffer, 0, readBytes);
                    }
                    rawDataStream.Close();
                    result = rawDataStream.ToArray();
                }
            }

            return(result);
        }
示例#5
0
 public byte[] Compress(byte[] rawData, ChunkCompressionType compressType)
 {
     return(Compress(rawData, 0, rawData.Length));
 }
示例#6
0
 public byte[] Decompress(byte[] compressData, ChunkCompressionType compressType)
 {
     return(Decompress(compressData, 0, compressData.Length));
 }