Я пытаюсь читать простые 2048 байт размера секторов данных с компакт-диска данных на OS X.Как читать простые сектора данных (mode1) с компакт-диска на OS X
Но когда я открываю устройство, такое как «/ dev/disk8», я получаю секторы размером 2352 с 16-байтным заголовком перед фактическими данными режима 1 каждого сектора.
Даже с BSD инструментами, такими как шестнадцатеричное это можно увидеть, при чтении старой CD, сделанного Apple:
$ hexdump -n 512 -C /dev/disk8
00000000 00 ff ff ff ff ff ff ff ff ff ff 00 00 02 00 01 |................|
00000010 45 52 08 00 00 05 00 00 00 01 00 01 00 00 00 00 |ER..............|
00000020 00 04 00 00 00 10 00 05 00 01 00 00 00 1e 00 19 |................|
00000030 ff ff 00 00 00 41 00 05 07 01 00 00 00 4f 00 1f |.....A.......O..|
00000040 f8 ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
данные фактического сектора начинается здесь по смещению 0x10 с «ER». Но «ER» должно быть смещено 0.
Как я могу сделать эту работу в своем приложении без необходимости удаления дополнительных данных на отдельный шаг?
Я просмотрел различные функции ioctl
в «IOCDMediaBSDClient.h» и «IOCDTypes.h», но не смог найти тот, который позволяет мне указать, что я хочу получить только простой контент данных из секторов.
Я также считаю, что мой существующий код, который я написал около 15 лет назад, смог справиться с этим по своему желанию, но с тех пор что-то изменилось в OS X, нарушив мой старый код. И теперь я не могу понять, как это исправить. В этом коде используется ioctl
с DKIOCCDREAD
с параметрами sectorArea=kCDSectorAreaUser
и sectorType=kCDSectorTypeMode1
. Но это дает мне 16-байтовый заголовок, как и обычный вызов read
, хотя Mode1 означает, что я должен получать 2048 байтовых секторов без заголовков, насколько я понимаю.
Вы пытались использовать узел устройства rdisk вместо узла 'disk'? (т. е. '/ dev/rdisk8') – pmdj
Как ни странно,' hexdump -n 512 -C/dev/rdisk8' дает ошибку («Недопустимый аргумент»). Но когда я использую open() на «rdisk», он работает с функцией 'ioctl'. Итак, оказывается, что в моем старом коде ничего не сломалось, я просто испортился, используя правильное имя диска (я использовал rdisk изначально, но позже изменил его на диск, потому что не видел разницы при доступе к «нормальным» дискам). Вам нравится писать правильный ответ? В противном случае я это сделаю. –
Прохладный, рад, что получилось ОК. Счастлив написать ответ. :-) – pmdj