如何在PHP中获得二进制文件块?

如何在PHP中获得二进制文件块?,php,file-io,binaryfiles,magic-numbers,sfx,Php,File Io,Binaryfiles,Magic Numbers,Sfx,我正在创建一个PHP应用程序,它在某个时候会从网站下载一个SFX归档文件,并需要从中提取数据 因为我在Linux机器上运行这个程序,所以我需要切掉文件的SFX可执行部分,并将压缩文件保存在文件系统上,然后运行一个程序来解压缩。(SFX归档文件基本上是一个EXE文件,后面加上压缩归档文件。我用十六进制编辑器之类的工具手动尝试过,效果很好。) SFX归档中压缩归档的文件类型始终相同,我知道该文件类型的神奇数字 在PHP中,我需要做的是,在下载文件(假设一个简单的文件\u get\u contents

我正在创建一个PHP应用程序,它在某个时候会从网站下载一个SFX归档文件,并需要从中提取数据

因为我在Linux机器上运行这个程序,所以我需要切掉文件的SFX可执行部分,并将压缩文件保存在文件系统上,然后运行一个程序来解压缩。(SFX归档文件基本上是一个EXE文件,后面加上压缩归档文件。我用十六进制编辑器之类的工具手动尝试过,效果很好。)

SFX归档中压缩归档的文件类型始终相同,我知道该文件类型的神奇数字

在PHP中,我需要做的是,在下载文件(假设一个简单的
文件\u get\u contents()
使用URL参数)并且它位于内存中之后,我需要从压缩档案的神奇数字开始的内容中提取数据


我在想我可能会使用某种正则表达式方法,但是,我需要将其处理为二进制信息(幻数需要表示为十六进制),而不是字符数据。幻数本身包含非打印/不显示为任何可读字符的十六进制值。

您可以使用
\xXX
语法
预匹配
二进制:

preg_match('/\x00/', chr(0))

您可以使用
\xXX
语法
preg\u匹配
二进制:

preg_match('/\x00/', chr(0))

正则表达式是二进制安全的。但是,使用
strpos
可能会更好

$magicpos = strpos($downloaded_data,"\x1a\x09\x01");
假设幻数是0x1A 0x09 0x01-您可以用实际数字替换它。然后:

$archive = substr($downloaded_data,$magicpos);

这将从幻数(包括)开始获取存档数据。

正则表达式是二进制安全的。但是,使用
strpos
可能会更好

$magicpos = strpos($downloaded_data,"\x1a\x09\x01");
假设幻数是0x1A 0x09 0x01-您可以用实际数字替换它。然后:

$archive = substr($downloaded_data,$magicpos);

这将从魔术数字(包括在内)开始获得存档数据。

谢谢!我最终在一个
preg_match()
上使用了这个值,因为我能够将它全部放在一行上(我将
$magicpos
代码直接放在
substr
函数中,因为我没有理由再次使用该值)。@jzimmerman2011:你能在这里添加你的代码,让这个问题有一些价值吗?例如,您使用的魔法数字不是问题的一部分,但您已将其标记为SFX等。谢谢!我最终在一个
preg_match()
上使用了这个值,因为我能够将它全部放在一行上(我将
$magicpos
代码直接放在
substr
函数中,因为我没有理由再次使用该值)。@jzimmerman2011:你能在这里添加你的代码,让这个问题有一些价值吗?例如,你使用的魔法数字不是问题的一部分,但你已经将其标记为SFX等等;我一直认为它是用于严格基于字符的数据,而不是二进制数据(但一旦我真正考虑过它,它就有意义了)。我最终没有使用这个解决方案,但是,我不怀疑这是一种方法。谢谢我不知道你可以在正则表达式中使用二进制的东西;我一直认为它是用于严格基于字符的数据,而不是二进制数据(但一旦我真正考虑过它,它就有意义了)。我最终没有使用这个解决方案,但是,我不怀疑这是一种方法。谢谢我想你有很多附加的数据。您可能希望使用而不是将所有内容加载到内存中。另外请注意,PHP中的字符串是二进制的:
stream\u copy\u to\u stream
可能会有所帮助,但是,在我的例子中,整个文件总是只有几MB(并且它不是在生产服务器上运行的,所以它不需要非常高效)。好的建议。我想你有很多附加的数据。您可能希望使用而不是将所有内容加载到内存中。另外请注意,PHP中的字符串是二进制的:
stream\u copy\u to\u stream
可能会有所帮助,但是,在我的例子中,整个文件总是只有几MB(并且它不是在生产服务器上运行的,所以它不需要非常高效)。好建议。