Ejemplo n.º 1
0
        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);
                    }
                }
            }
        }
Ejemplo n.º 2
0
        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);
                    }
                }
            }
        }