using System.Collections.Generic; using DiscImageChef.Helpers; namespace DiscImageChef.Filesystems.ISO9660 { public partial class ISO9660 { PathTableEntryInternal[] DecodePathTable(byte[] data) { if(data is null) return null; List table = new List(); int off = 0; while(off < data.Length) { PathTableEntry entry = Marshal.ByteArrayToStructureBigEndian(data, off, Marshal.SizeOf()); if(entry.name_len == 0) break; off += Marshal.SizeOf(); string name = Encoding.GetString(data, off, entry.name_len); table.Add(new PathTableEntryInternal { Extent = entry.start_lbn, Name = name, Parent = entry.parent_dirno, XattrLength = entry.xattr_len }); off += entry.name_len; if(entry.name_len % 2 != 0) off++; } return table.ToArray(); } PathTableEntryInternal[] DecodeHighSierraPathTable(byte[] data) { if(data is null) return null; List table = new List(); int off = 0; while(off < data.Length) { HighSierraPathTableEntry entry = Marshal.ByteArrayToStructureBigEndian(data, off, Marshal .SizeOf()); if(entry.name_len == 0) break; off += Marshal.SizeOf(); string name = Encoding.GetString(data, off, entry.name_len); table.Add(new PathTableEntryInternal { Extent = entry.start_lbn, Name = name, Parent = entry.parent_dirno, XattrLength = entry.xattr_len }); off += entry.name_len; if(entry.name_len % 2 != 0) off++; } return table.ToArray(); } } }