public static long Decompress(ClosableMemoryStream instream, long inLength, ref ClosableMemoryStream outstream) { long num = 0L; byte num2 = (byte)instream.ReadByte(); byte[] buffer = new byte[3]; instream.Read(buffer, 0, 3); int num3 = IOUtils.ToNDSu24(buffer, 0); num += 4L; if (num3 == 0) { buffer = new byte[4]; instream.Read(buffer, 0, 4); num3 = IOUtils.ToNDSs32(buffer, 0); num += 4L; } int num4 = 0x1000; byte[] buffer2 = new byte[num4]; int index = 0; int num6 = 0; int num7 = 0; int num8 = 1; while (num6 < num3) { if (num8 == 1) { num7 = instream.ReadByte(); num += 1L; num8 = 0x80; } else { num8 = num8 >> 1; } if ((num7 & num8) > 0) { int num12; int num13; int num9 = instream.ReadByte(); num += 1L; int num10 = num9 >> 4; int num11 = -1; if (num10 == 0) { num12 = instream.ReadByte(); num += 1L; num13 = instream.ReadByte(); num += 1L; num10 = (((num9 & 15) << 4) | (num12 >> 4)) + 0x11; num11 = (((num12 & 15) << 8) | num13) + 1; } else if (num10 == 1) { num12 = instream.ReadByte(); num += 1L; num13 = instream.ReadByte(); num += 1L; int num14 = instream.ReadByte(); num += 1L; num10 = ((((num9 & 15) << 12) | (num12 << 4)) | (num13 >> 4)) + 0x111; num11 = (((num13 & 15) << 8) | num14) + 1; } else { num12 = instream.ReadByte(); num += 1L; num10 = ((num9 & 240) >> 4) + 1; num11 = (((num9 & 15) << 8) | num12) + 1; } int num15 = (index + num4) - num11; for (int i = 0; i < num10; i++) { byte num17 = buffer2[num15 % num4]; num15++; outstream.WriteByte(num17); buffer2[index] = num17; index = (index + 1) % num4; } num6 += num10; } else { int num18 = instream.ReadByte(); num += 1L; outstream = new ClosableMemoryStream(); outstream.WriteByte((byte)num18); num6++; buffer2[index] = (byte)num18; index = (index + 1) % num4; } } if (num < inLength) { } return((long)num3); }
public static long Decompress(ClosableMemoryStream instream, long inLength, ref ClosableMemoryStream outstream) { long num = 0L; instream.Seek(0L, SeekOrigin.Begin); byte num2 = (byte)instream.ReadByte(); byte[] buffer = new byte[3]; instream.Read(buffer, 0, 3); int num3 = IOUtils.ToNDSu24(buffer, 0); num += 4L; if (num3 == 0) { buffer = new byte[4]; instream.Read(buffer, 0, 4); num3 = IOUtils.ToNDSs32(buffer, 0); num += 4L; } int num4 = 0x1000; byte[] buffer2 = new byte[num4]; int index = 0; int num6 = 0; int num7 = 0; int num8 = 1; outstream = new ClosableMemoryStream(); while (num6 < num3) { if (num8 == 1) { num7 = instream.ReadByte(); num += 1L; num8 = 0x80; } else { num8 = num8 >> 1; } if ((num7 & num8) > 0) { if (((num + 1L) >= inLength) && (num < inLength)) { instream.ReadByte(); num += 1L; } int num9 = instream.ReadByte(); num += 1L; int num10 = instream.ReadByte(); num += 1L; int num11 = num9 >> 4; num11 += 3; int num12 = ((num9 & 15) << 8) | num10; num12++; int num13 = (index + num4) - num12; for (int i = 0; i < num11; i++) { byte num15 = buffer2[num13 % num4]; num13++; outstream.WriteByte(num15); buffer2[index] = num15; index = (index + 1) % num4; } num6 += num11; } else { int num16 = instream.ReadByte(); num += 1L; num6++; outstream.WriteByte((byte)num16); buffer2[index] = (byte)num16; index = (index + 1) % num4; } } if (num < inLength) { } return((long)num3); }