public byte[] doCompress(byte[] data) { byte[] buffer = new byte[data.Length]; ByteHelper.Write_be((uint)0x524e4301, buffer, 0); ByteHelper.Write_be((uint)data.Length, buffer, 4); ByteHelper.Write_be(RNCCommon.crc(data, 0, data.Length), buffer, 12); this.bf = new BitBuffer(buffer, 0x12); byte num = 0; this.bf.writeBits(0, 2); this.ibuf = data; this.ipos = 0; while (this.ipos < this.ibuf.Length) { Tuple[] block = this.makeBlock(); this.writeBlock(block); num = (byte)(num + 1); } this.bf.writeEnd(); Array.Resize<byte>(ref buffer, this.bf.position); ByteHelper.Write_be((uint)(buffer.Length - 0x12), buffer, 8); ByteHelper.Write_be(RNCCommon.crc(buffer, 0x12, buffer.Length - 0x12), buffer, 14); buffer[0x10] = 0; buffer[0x11] = num; return buffer; }
public byte[] doDecompress(byte[] data) { if (ByteHelper.Read32_be(data, 0) != 0x524e4301) { throw new ExBadFormat("signature"); } uint num2 = ByteHelper.Read32_be(data, 4); uint num3 = ByteHelper.Read32_be(data, 8); ushort num4 = ByteHelper.Read16_be(data, 12); ushort num5 = ByteHelper.Read16_be(data, 14); byte num6 = data[0x11]; if (RNCCommon.crc(data, 0x12, (int)num3) != num5) { throw new ExBadCRC("packed"); } this.bf = new BitBuffer(data, 0x12); byte[] destinationArray = new byte[num2]; int index = 0; this.bf.readBits(2); do { RNCCommon.Huff[] table = this.makeHuffTable(); RNCCommon.Huff[] huffArray2 = this.makeHuffTable(); RNCCommon.Huff[] huffArray3 = this.makeHuffTable(); ushort num8 = (ushort)this.bf.readBits(0x10); do { uint num9 = this.inputValue(table); if (num9 > 0) { Array.Copy(this.bf.getBytes((int)num9), 0L, destinationArray, (long)index, (long)num9); index += (int)num9; } if (num8 > 1) { uint num10 = (uint)(this.inputValue(huffArray2) + 1); num9 = (uint)(this.inputValue(huffArray3) + 2); while (num9-- > 0) { destinationArray[index] = destinationArray[(int)((IntPtr)(index - num10))]; index++; } } } while ((num8 = (ushort)(num8 - 1)) != 0); if (num6 > 0) { num6 = (byte)(num6 - 1); } } while (num6 > 0); if (RNCCommon.crc(destinationArray, 0, destinationArray.Length) != num4) { throw new ExBadCRC("unpacked"); } return destinationArray; }