我正在创建一个PHP应用程序,在某些时候会从网站下载SFX存档,并需要从中提取数据。
由于我在Linux机器上运行它,我需要切断文件的SFX可执行部分并将压缩文件保存在文件系统上,然后我将运行一个程序来解压缩/解压缩。 (SFX存档基本上是一个EXE文件,后面加上压缩存档。我用十六进制编辑器手动尝试了这个,以及它可以正常工作。)
SFX存档中压缩存档的文件类型将始终相同,我知道该文件类型的幻数是什么。
我在PHP中需要做的是,在下载文件后(让我们假设一个简单的file_get_contents()
使用URL参数)并且它位于内存中,我需要从内容中提取数据压缩档案的神奇数字。
我想我可能会做某种正则表达式方法,但是,我需要将其作为二进制信息处理(幻数将需要表示为十六进制)而不是字符数据。幻数本身包含非打印/不显示为任何可读字符的十六进制值。
答案 0 :(得分:2)
正则表达式是二进制安全的。不过,使用strpos
可能会更好。
$magicpos = strpos($downloaded_data,"\x1a\x09\x01");
假设幻数为0x1A 0x09 0x01 - 您可以用实际数字替换它。然后:
$archive = substr($downloaded_data,$magicpos);
这将从幻数(包括)开始获取存档数据。
答案 1 :(得分:1)
您可以使用preg_match
语法\xXX
二进制文件:
preg_match('/\x00/', chr(0))