protected override bool ReadFile(BinaryReader r) { var length = (int)r.BaseStream.Length; if (length < FileHeader.Size) { return false; } var bytes = r.ReadBytes((int)FileHeader.Size); var seg = new ArraySegment<byte>(bytes); Header.ReadFile(seg); if (Header.HeaderCount == 0 || Header.TailerCount == 0 || Header.TailerCount != Header.HeaderCount) { return false; } var skip = 770 * Header.PaletteCount; var hstart = (int)(skip + FileHeader.Size); var hlen = (int)(SectionHeader.Size * Header.HeaderCount); var tstart = (int)(hstart + hlen + Header.BodySize); var tlen = (int)(SectionTailer.Size * Header.TailerCount); if (tstart + tlen < length) { return false; } r.BaseStream.Seek(skip, SeekOrigin.Current); var hbytes = r.ReadBytes(hlen); for (var i = 0; i < Header.HeaderCount; ++i) { seg = new ArraySegment<byte>(hbytes, i * SectionHeader.Size, SectionHeader.Size); var S = new Section(); Sections.Add(S); if (!S.Head.ReadFile(seg)) { return false; } } var SectionBodyData = r.ReadBytes((int)Header.BodySize); var tbytes = r.ReadBytes(tlen); for (var i = 0; i < Header.TailerCount; ++i) { var S = Sections[i]; seg = new ArraySegment<byte>(tbytes, i * SectionTailer.Size, SectionTailer.Size); if (!S.Tail.ReadFile(seg)) { return false; } } seg = new ArraySegment<byte>(SectionBodyData); for (var i = 0; i < Header.TailerCount; ++i) { var S = Sections[i]; S.PrepareBody(); S.ReadFile(seg); } return true; }