using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Linq; namespace OpenVIII.Fields { public static partial class Msd { public static class Reader { public static IReadOnlyList FromBytes(byte[] buff) { var monologues = new List(); var bufferSize = buff.Length; if (bufferSize < 4) return monologues; ReadMessages(buff, monologues); return monologues; } private static void ReadMessages(byte[] buff, List monologues) { using (var br = new BinaryReader(new MemoryStream(buff))) { var dataOffset = br.ReadUInt32(); var count = checked((int)GetMessageNumber(dataOffset, br.BaseStream.Length)); if (count == 0) return; monologues.Capacity = count; var Offsets = new List(count) { dataOffset }; foreach (var i in Enumerable.Range(1,count-1)) { Offsets.Add(br.ReadUInt32()); } for (var i = 0; i < Offsets.Count; i++) { var offset = Offsets[i]; var nextoffset = i+1 bufferSize) throw new InvalidDataException($"Invalid data offset ({dataOffset}) is out of bounds ({bufferSize})."); return count; } } } }