使用Perl从文件读取和写入十六进制数据

时间:2011-07-04 02:56:16

标签: perl macos hex printf rsrc

我有一个创建文件的Perl脚本,我想写入他们的resource forks,以便指定他们应该打开的默认应用程序(我不能只使用{中的获取信息来更改它) {3}},它一直在恢复。)

我可以找到关于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,以便他们可以停止在他们的操作系统中使用它们来确定Finder之类的内容。啧!

2 个答案:

答案 0 :(得分:1)

您在该代码中遇到了一些问题。首先,在格式字符串后需要逗号:

printf OUT "%x", $theHex

现在我们有一些语法上有效的源代码,我们可以继续解决您的真正问题。期望printf%x格式字符串被赋予一个整数,但是你给它一个非数字字符串。当字符串值$theHex转换为整数时,您将得到零。解决此问题很简单,您只需要正确初始化$theHex

my $theHex = 0xDEADBEEF;

“0x”前缀告诉Perl您将数字写为十六进制;类似地,零前缀(例如0666)表示八进制。

现在你有一个0xDEADBEEF整数的十六进制字符串表示。

如果您只想将四个字节从一个资源分支复制到另一个资源分支,那么最好使用read读取四个原始字节,然后使用print将这些字节写入另一个资源分叉。

你可能想要看看pack,如果你正在bags bags bags bags bags bags。 AFAIK,资源分支需要四个字节,而不是一个四字节整数的八字节人类可读十六进制表示。

答案 1 :(得分:0)

Mac OS X仍有资源分叉,但它们已被弃用多年。资源与其他操作系统不兼容。这往往会让Mac与其他人玩得不好,从而将Mac分离成小岛屿。

资源分支主要用于可执行文件,但Mac OS X应用程序实际上是一个包含其内部资源的文件夹(也称为bundle)。

数据文件可以拥有资源分叉,但大部分都没有。如果他们这样做,主要是实现APPL / TYPE资源来说明文件类型是什么以及打开它的应用程序。现在,Mac OS X使用文件后缀。它不像资源分叉那样整洁,但它与其他应用程序的兼容性更高。

但是,如果您真的想要使用资源分叉和其他Mac oddements,请查看CPAN::Mac-Carbon。这将为您提供所需的一切。

注意!!

这是Mac- Carbon ,这意味着这将与Lion一起再见。其中大部分来自Mac OS X之前的旧系统6/7/8/9天,并且为了兼容性目的,保留了部分Mac OS X.