public override Stream OpenEntry(ArcFile arc, Entry entry) { if (entry.Name.HasAnyOfExtensions("TXT", "DAT")) { var input = arc.File.CreateStream(entry.Offset, entry.Size); var dec = new DesTransform(DefaultKey); return(new InputCryptoStream(input, dec)); } else if (entry.Name.HasExtension("JPG")) { using (var dec = new DesTransform(DefaultKey)) { var data = arc.File.View.ReadBytes(entry.Offset, entry.Size); for (int i = 0; i < data.Length; i += 0x1000) { int count = Math.Min(8, data.Length - i); dec.TransformBlock(data, i, count, data, i); } return(new BinMemoryStream(data, entry.Name)); } } else { return(base.OpenEntry(arc, entry)); } }
public override Stream OpenEntry(ArcFile arc, Entry entry) { if (entry.Name.HasAnyOfExtensions("TXT", "DAT")) { var input = arc.File.CreateStream(entry.Offset, entry.Size, entry.Name); int first_byte = (int)input.Signature & 0xFF; if (first_byte == '#' || first_byte == '*') { return(input); } var dec = new DesTransform(DefaultKey); return(new InputCryptoStream(input, dec)); } else if (entry.Name.HasExtension("JPG")) { using (var dec = new DesTransform(DefaultKey)) { var data = arc.File.View.ReadBytes(entry.Offset, entry.Size); for (int i = 0; i < data.Length; i += 0x1000) { int count = Math.Min(8, data.Length - i); dec.TransformBlock(data, i, count, data, i); } return(new BinMemoryStream(data, entry.Name)); } } else if (entry.Name.HasExtension("BMP")) { var data = arc.File.View.ReadBytes(entry.Offset, entry.Size); int bpp = data.ToUInt16(0x1C); if (4 == bpp) { data[0x1C] = 8; } else if (16 == bpp) { data[0x1C] = 24; } int pixels_src = 0x36; int pixels_length = data.Length - pixels_src; if (pixels_length > 0x493AA) { using (var dec = new DesTransform(DefaultKey)) { for (int src = pixels_src + 0x493AA; src + 8 <= data.Length; src += 0xA0) { dec.TransformBlock(data, src, 8, data, src); } } } return(new BinMemoryStream(data, entry.Name)); } else { return(base.OpenEntry(arc, entry)); } }