public static NbtCompression ToNbtCompression(this ChunkCompressionType type) { if (type == ChunkCompressionType.GZip) { return(NbtCompression.GZip); } if (type == ChunkCompressionType.ZLib) { return(NbtCompression.ZLib); } return(NbtCompression.AutoDetect); }
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 }
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); }
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); }
public byte[] Compress(byte[] rawData, ChunkCompressionType compressType) { return(Compress(rawData, 0, rawData.Length)); }
public byte[] Decompress(byte[] compressData, ChunkCompressionType compressType) { return(Decompress(compressData, 0, compressData.Length)); }