Как я могу прочитать каталог на iso9660 из таблицы путей, если таблица не содержит размер? - PullRequest
0 голосов
/ 26 сентября 2018

Согласно спецификации для структуры 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 Ответ

0 голосов
/ 27 сентября 2018

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

...