public U8_Parser(System.IO.Stream stream) { using (var reader = new FileReader(stream)) { reader.SetByteOrder(true); uint Signature = reader.ReadUInt32(); IsBigEndian = Signature == BEMagic; reader.SetByteOrder(IsBigEndian); uint FirstNodeOffset = reader.ReadUInt32(); uint NodeSectionSize = reader.ReadUInt32(); uint FileDataOffset = reader.ReadUInt32(); byte[] Reserved = new byte[4]; reader.SeekBegin(FirstNodeOffset); var RootNode = new NodeEntry(); RootNode.Read(reader); //Root has total number of nodes uint TotalNodeCount = RootNode.Setting2; //Read all our entries List <NodeEntry> entries = new List <NodeEntry>(); entries.Add(RootNode); for (int i = 0; i < TotalNodeCount - 1; i++) { var node = new NodeEntry(); node.Read(reader); entries.Add(node); } //Read string pool uint stringPoolPos = 0; Dictionary <uint, string> StringTable = new Dictionary <uint, string>(); for (int i = 0; i < TotalNodeCount; i++) { string str = reader.ReadString(Syroot.BinaryData.BinaryStringFormat.ZeroTerminated, Encoding.ASCII); StringTable.Add(stringPoolPos, str); stringPoolPos += (uint)str.Length + 1; } //Set the strings for (int i = 0; i < TotalNodeCount; i++) { entries[i].Name = StringTable[entries[i].StringPoolOffset]; } entries[0].Name = "Root"; SetFileNames(entries, 1, entries.Count, ""); for (int i = 0; i < entries.Count; i++) { if (entries[i].nodeType != NodeEntry.NodeType.Directory) { FileEntry entry = new FileEntry(); reader.SeekBegin(entries[i].Setting1); entry.SetData(reader.ReadBytes((int)entries[i].Setting2)); entry.FileName = entries[i].FullPath; Files.Add(entry); } } } }
public void Load(System.IO.Stream stream) { using (var reader = new FileReader(stream)) { reader.ByteOrder = Syroot.BinaryData.ByteOrder.BigEndian; uint Signature = reader.ReadUInt32(); IsBigEndian = Signature == BEMagic; reader.SetByteOrder(IsBigEndian); uint FirstNodeOffset = reader.ReadUInt32(); uint NodeSectionSize = reader.ReadUInt32(); uint FileDataOffset = reader.ReadUInt32(); byte[] Reserved = new byte[4]; Console.WriteLine("FirstNodeOffset " + FirstNodeOffset); reader.SeekBegin(FirstNodeOffset); var RootNode = new NodeEntry(); RootNode.Read(reader); //Root has total number of nodes uint TotalNodeCount = RootNode.Setting2; //Read all our entries List <NodeEntry> entries = new List <NodeEntry>(); entries.Add(RootNode); for (int i = 0; i < TotalNodeCount - 1; i++) { var node = new NodeEntry(); node.Read(reader); entries.Add(node); } //Read string pool uint stringPoolPos = 0; Dictionary <uint, string> StringTable = new Dictionary <uint, string>(); for (int i = 0; i < TotalNodeCount; i++) { string str = reader.ReadString(Syroot.BinaryData.BinaryStringFormat.ZeroTerminated, Encoding.ASCII); StringTable.Add(stringPoolPos, str); stringPoolPos += (uint)str.Length + 1; } //Set the strings for (int i = 0; i < TotalNodeCount; i++) { entries[i].Name = StringTable[entries[i].StringPoolOffset]; } entries[0].Name = "Root"; //Setup our directory entries for loading to the tree DirectoryEntry[] dirs = new DirectoryEntry[TotalNodeCount]; for (int i = 0; i < dirs.Length; i++) { dirs[i] = new DirectoryEntry(); } DirectoryEntry currentDir = dirs[1]; nodes.Add(dirs[0]); //Skip root so start index at 1 int dirIndex = 1; for (int i = 0; i < TotalNodeCount; i++) { var node = entries[i]; if (node.Name == string.Empty) { continue; } Console.WriteLine($"{ node.Name} {i} {node.nodeType} {node.Setting1}"); if (node.nodeType == NodeEntry.NodeType.Directory) { dirs[i].Name = node.Name; dirs[i].nodeEntry = node; currentDir = dirs[i]; if (i != 0) { dirs[node.Setting1].AddNode(currentDir); } } else { FileEntry entry = new FileEntry(); entry.FileName = node.Name; entry.Name = node.Name; entry.nodeEntry = node; currentDir.nodes.Add(entry); reader.SeekBegin(entry.nodeEntry.Setting1); entry.FileData = reader.ReadBytes((int)entry.nodeEntry.Setting2); files.Add(entry); } } } }