Как я могу прочитать каталог на 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тогда я знаю, что достиг конца записи, но у этого есть три проблемы:

  1. Если это был канонический способ, зачем вообще включать размер в запись каталога?
  2. Если он включает 2 или 3 сектора, для меня более эффективно читать их все сразу, чем по одному за раз.
  3. Если у меня есть каталог, записи которого точно заполняют сектор, без какого-либо атрибута размера, я не знаю, должен ли следующий сектор считываться как запись или каталог заканчивался здесь.

По сути, я знаю, как читать упорядоченную таблицу путей, чтобы получить запись каталога, но не знаю, как ее использовать, чтобы узнать, сколько секторов нужно прочитать для самого каталога. Теоретически я мог бы прочитать родительский элемент, чтобы получить запись для этого каталога, чтобы узнать размер, но это добавляет поиск и чтение и в значительной степени противоречит цели таблицы путей.

1 ответ

Решение

Ах, я понял это. Поскольку записи каталога всегда начинаются с записи каталога для самого каталога, а длина данных всегда составляет байты 10-17 (10-13 для младшего байта, 13-17 для старшего байта), вы можете просто прочитать байты 10- 17 с начала сектора и получить размер. Все еще не так эффективно, как положить его в таблицу путей - не знаю, почему они этого не сделали - но это работает.

Другие вопросы по тегам