using System; using System.Collections.Generic; using System.IO; using System.IO.Compression; using System.Text; public class Images { private List images = new List(); private Dictionary refs = new Dictionary(); public Images(Stream s) { ExtractTar(Decompress(s)); } private DeflateStream Decompress(Stream s) { return new DeflateStream(s, CompressionMode.Decompress); } private void ExtractTar(Stream stream) { var buffer = new byte[100]; while (true) { stream.Read(buffer, 0, 100); var name = Encoding.ASCII.GetString(buffer).Trim('\0'); if (String.IsNullOrWhiteSpace(name)) break; stream.Seek(24, SeekOrigin.Current); stream.Read(buffer, 0, 12); var size = Convert.ToInt64(Encoding.ASCII.GetString(buffer, 0, 12).Trim(), 8); stream.Seek(376L, SeekOrigin.Current); var buf = new byte[size]; stream.Read(buf, 0, buf.Length); if (name.EndsWith(".ref.txt")) { string r = Encoding.UTF8.GetString(buf).Trim('\0'); refs.Add(name.Replace(".ref.txt", ".png"), refs[r]); }else{ int i = images.Count; images.Add(buf); refs.Add(name, i); } var pos = stream.Position; var offset = 512 - (pos % 512); if (offset == 512) offset = 0; stream.Seek(offset, SeekOrigin.Current); } } public byte[] GetImage(string name) { return images[refs[name]]; } }