Чтение и запись шестнадцатеричных данных из файла с помощью Perl - PullRequest
0 голосов
/ 04 июля 2011

У меня есть Perl-скрипт, который создает файлы, и я хочу записать в их ресурсные вилки , чтобы указать приложение по умолчанию, с которым они должны открываться (я не могу просто изменить его с помощью get информация в Искатель , он продолжает возвращаться).

Я мог бы узнать о тайных вещах от Apple, но в своих целях я рад прочитать данные из существующей ветки ресурсов, которая открывается с нужным приложением, и жестко закодировать их в мой сценарий. Проблема в том, что я слишком новичок в Perl, чтобы знать, как читать шестнадцатеричные числа из файла, копировать и вставлять их в мой скрипт и правильно записывать их как шестнадцатеричные в мои новые .rsrc файлы.

Я хочу сделать что-то вроде:

my $theHex="DEADBEEF" #<---this is where I would paste the hex from the existing rsrc file
open (OUT, ">$filename/rsrc"); #<--this is the resource fork for file $filename
printf OUT "%x" $theHex #<----I'm not sure that this formatting is right

Редактировать: Да, я знаю , форки ресурсов устарели. Пожалуйста, сообщите об этом Apple, чтобы они перестали использовать их в своей ОС для определения таких вещей, как , какое приложение открывает конкретный файл . Sheesh!

Ответы [ 2 ]

1 голос
/ 04 июля 2011

У вас есть пара проблем в этом коде.Прежде всего, вам нужна запятая после вашей строки формата:

printf OUT "%x", $theHex

Теперь, когда у нас есть синтаксически верный исходный код, мы можем перейти к вашей реальной проблеме.Ожидается, что строка формата %x для printf получит целое число, но вы даете ей нечисловую строку.Когда строковое значение $theHex преобразуется в целое число, вы получите ноль.Исправить это легко, вам просто нужно правильно инициализировать $theHex:

my $theHex = 0xDEADBEEF;

Префикс «0x» сообщает Perl, что вы пишете число в шестнадцатеричном виде;аналогично, нулевой префикс (например, 0666) обозначает восьмеричное число.

Теперь у вас есть шестнадцатеричное строковое представление целого числа 0xDEADBEEF.

Если вы просто хотите скопировать четыре байта из одной ветки ресурсас другой, тогда лучше использовать read для чтения четырех необработанных байтов, а затем использовать print для записи этих байтов в другой ветвь ресурса.

Возможно, вам захочется взглянуть на pack, если вы разбрасываете bag'o'bytes.AFAIK, ветвь ресурса хочет четыре байта , а не восьмибайтовое читаемое человеком шестнадцатеричное представление четырехбайтового целого числа.

0 голосов
/ 04 июля 2011

В Mac OS X все еще есть ветки ресурсов, но они устарели в течение многих лет.Ресурсы плохо работают с другими операционными системами.Это, как правило, приводило к тому, что Маки плохо играли с другими и, таким образом, сами по себе изолировали Маки на маленькие островки.

Вилки ресурсов в основном использовались с исполняемыми файлами, но приложение Mac OS X на самом деле представляет собой папку (иначе называемый комплект), которая содержитресурсы внутри него.

Файлы данных могут иметь вилки ресурсов, но большинство не имеют.Если они это сделали, это было главным образом для реализации ресурсов APPL / TYPE для определения типа файла и приложения для его открытия.Теперь Mac OS X использует файловые суффиксы.Он не такой аккуратный, как ресурсные вилки, но гораздо более совместим с другими приложениями.

Однако, если вы действительно хотите работать с вилками ресурсов и другими требованиями Mac, взгляните на CPAN ::Mac-Carbon .Это даст вам то, что вам нужно.

ПРИМЕЧАНИЕ !!

Это Mac- Углерод , что означает, что это покаLion.Большая часть этого - из старой системы 6/7/8/9 дней до Mac OS X, и некоторые из этих Mac OS X сохранены для целей совместимости.

...