Как я могу прочитать каталог на iso9660 из таблицы путей, если таблица не содержит размер?
Согласно спецификации для структуры iso9660 / ecma119, таблица путей содержит записи для каждого пути, включая местоположение начального сектора и его имя, но не его размер. Я могу найти запись каталога, но не знаю, сколько секторов (обычно 2048 байт) она содержит. Это один? Два? Шесть?
Если я "пройдусь по дереву каталогов", то каждая запись в каталоге будет содержать указанное местоположение и размер, поэтому я могу знать, сколько байтов (по сути, сколько секторов, поскольку каталог должен использовать целые сектора) для чтения. Однако таблица путей включает только начальное местоположение, а не размер, поэтому я не знаю, сколько байтов нужно прочитать.
В примере iso у меня есть (ubuntu-18.04.1-live-server-amd64.iso
fwiw), запись корневого каталога в дескрипторе основного тома показывает:
Root Directory:
Directory Record Length: 34
Extended Attribute Length: 0
Location of Extent: 20 $00000014 00:00:20
Data Length: 2048 $00000800
Recording Date and Time: 23:39:04 07/25/2018 GMT 0
File Flags: $02 visible regular dir non-record no-perms single-extent
File Unit Size: 0
Interleave Gap Size: 0
Volume Sequence Number: 1
File Identifier: . (current directory)
Так как это говорит Data Length
является 2048
Знаю читать только один сектор.
Тем не менее, запись корневого каталога в таблице путей показывает:
Path Record Length: 10 $0A
Extended Attribute Length: 0 $00
Location of Extent: 20 $00000014 00:00:20
Parent Directory Number: 1 $0001
File Identifier: . (current directory)
Это также указывает на сектор 20
, но не говорит мне, сколько секторов он использует, оставляя меня гадать.
Да, неиспользуемые байты в секторе должны быть все 0x00
, поэтому, если я читаю в секторе, читаю записи, а затем перехожу к тому, чей первый байт (длина) 0x00
тогда я знаю, что достиг конца записи, но у этого есть три проблемы:
- Если это был канонический способ, зачем вообще включать размер в запись каталога?
- Если он включает 2 или 3 сектора, для меня более эффективно читать их все сразу, чем по одному за раз.
- Если у меня есть каталог, записи которого точно заполняют сектор, без какого-либо атрибута размера, я не знаю, должен ли следующий сектор считываться как запись или каталог заканчивался здесь.
По сути, я знаю, как читать упорядоченную таблицу путей, чтобы получить запись каталога, но не знаю, как ее использовать, чтобы узнать, сколько секторов нужно прочитать для самого каталога. Теоретически я мог бы прочитать родительский элемент, чтобы получить запись для этого каталога, чтобы узнать размер, но это добавляет поиск и чтение и в значительной степени противоречит цели таблицы путей.
1 ответ
Ах, я понял это. Поскольку записи каталога всегда начинаются с записи каталога для самого каталога, а длина данных всегда составляет байты 10-17 (10-13 для младшего байта, 13-17 для старшего байта), вы можете просто прочитать байты 10- 17 с начала сектора и получить размер. Все еще не так эффективно, как положить его в таблицу путей - не знаю, почему они этого не сделали - но это работает.