public static MetaDataFile ParseFile(PackFile file, PackFileService pf) { var fileContent = file.DataSource.ReadData(); var contentLength = fileContent.Count(); MetaDataFile outputFile = new MetaDataFile() { FileName = pf.GetFullPath(file), Version = BitConverter.ToInt32(fileContent, 0) }; if (outputFile.Version != 2) { throw new Exception($"Unknown version - {outputFile.Version} for {outputFile.FileName}"); } if (contentLength > 8) { MetaDataTagItem currentElement = null; int numElements = BitConverter.ToInt32(fileContent, 4); int currentIndex = 0 + 8; // First 4 bytes is the number of elements, next 2 is unknown while (currentIndex != contentLength && (currentElement = GetElement(currentIndex, fileContent, outputFile.FileName, out currentIndex)) != null) { outputFile.TagItems.Add(currentElement); } if (numElements != outputFile.TagItems.Count) { throw new Exception($"Not the expected amount elements. Expected {numElements}, got {outputFile.TagItems.Count}"); } } return(outputFile); }
internal static byte[] GenerateBytes(MetaDataFile output) { List <byte> data = new List <byte>(); data.AddRange(BitConverter.GetBytes((int)output.Version)); data.AddRange(BitConverter.GetBytes((int)output.TagItems.Count)); foreach (var item in output.TagItems) { data.AddRange(ByteParsers.String.Encode(item.Name, out _)); data.AddRange(item.DataItems[0].Bytes); } return(data.ToArray()); }