/// <summary> /// Read the sequence data. /// </summary> /// <param name="br">The reader.</param> public void Read(BinaryDataReader br) { //Open file. FileReader FileReader = new FileReader(); FileReader.OpenFile(br, out writeMode, out Version); //Data block. FileReader.OpenBlock(br, 0); //Get size. br.Position -= 4; uint size = br.ReadUInt32(); //Read the sequence data. BE for WiiU and 3ds, LE for NX. Must therefore write a parser. List <byte> tempSeqData = br.ReadBytes((int)size - 8).ToList(); //Trim data. bool foundEnd = false; while (!foundEnd) { //Remove padding stuff. if (tempSeqData[tempSeqData.Count - 1] == 0) { tempSeqData.RemoveAt(tempSeqData.Count - 1); } //Found end. else { foundEnd = true; } } //Close data block. FileReader.CloseBlock(br); //Label block. FileReader.OpenBlock(br, 1); //Open the reference table. FileReader.OpenReferenceTable(br, "Labels"); //Go through all the references. Labels = new List <SequenceLabel>(); for (int i = 0; i < FileReader.ReferenceTableCount("Labels"); i++) { //Reference is null. if (FileReader.ReferenceTableReferenceIsNull(i, "Labels")) { Labels.Add(null); } //Label exist. else { //Jump to label. FileReader.ReferenceTableJumpToReference(br, i, "Labels"); //Start label info structure. FileReader.StartStructure(br); //Get reference to data. FileReader.OpenReference(br, "ToSeqData"); //String size. uint stringSize = br.ReadUInt32(); //String data. string labelNow = new string(br.ReadChars((int)stringSize)); //Get label info. Labels.Add(new SequenceLabel() { Offset = FileReader.ReferenceGetOffset("ToSeqData"), Label = labelNow }); //Close reference. FileReader.CloseReference("ToSeqData"); //End label info structure. FileReader.EndStructure(); } } //Close the reference table. FileReader.CloseReferenceTable("Labels"); //Close label block. FileReader.CloseBlock(br); //Convert labels to dictionary. Dictionary <string, int> publicLabels = new Dictionary <string, int>(); foreach (var e in Labels) { if (e != null) { publicLabels.Add(e.Label, e.Offset); } } //Set sequence data. SequenceData = new SequenceData(); SequenceData.PublicLabelOffsets = publicLabels; Syroot.BinaryData.ByteOrder bo = Syroot.BinaryData.ByteOrder.BigEndian; if (writeMode == WriteMode.NX || writeMode == WriteMode.C_BE) { bo = Syroot.BinaryData.ByteOrder.LittleEndian; } SequenceData.Read(tempSeqData.ToArray(), bo); goodData = tempSeqData.ToArray(); //Close file. FileReader.CloseFile(br); }