Php 检查二进制图像数据

Php 检查二进制图像数据,php,binaryfiles,Php,Binaryfiles,我需要通过检查二进制数据找到用户上传的文件类型,我找到了完美的解决方案 具体来说,这是我正在使用的函数: function getImgType($filename) { $handle = @fopen($filename, 'r'); if (!$handle) throw new Exception('File Open Error'); $types = array('jpeg' => "\xFF\xD8\xFF", 'gif' =>

我需要通过检查二进制数据找到用户上传的文件类型,我找到了完美的解决方案

具体来说,这是我正在使用的函数:

function getImgType($filename) {
    $handle = @fopen($filename, 'r');
    if (!$handle)
        throw new Exception('File Open Error');

    $types = array('jpeg' => "\xFF\xD8\xFF", 'gif' => 'GIF', 'png' => "\x89\x50\x4e\x47\x0d\x0a", 'bmp' => 'BM', 'psd' => '8BPS', 'swf' => 'FWS');
    $bytes = fgets($handle, 8);
    $found = 'other';

    foreach ($types as $type => $header) {
        if (strpos($bytes, $header) === 0) {
            $found = $type;
            break;
        }
    }
    fclose($handle);
    return $found;
}

现在我的问题是,我如何为其他文件类型获取位,如
.zip、.exe、mp3、mp4
等。。。如果某个地方有某种列表,那就太好了,不过我想自己提取它,并了解所有这些是如何工作的。

大多数文件都有一个特定的头或文件签名或(显然)幻数,它们是同一事物的不同名称:文件开头有一组固定的字节

比如说,

此网页包含许多文件签名:


如果搜索
.extension file format
.extension file header
,通常会找到文件格式的说明。

您要查找的内容称为“文件签名”、“魔法字节”或“魔法数字”

对于许多文件格式,列出了很多


但是,我不会依赖它们来识别文件格式改用。

你要找的东西叫做

幻数是文件签名的一种类型,因为有时它比幻数更能识别文件

可以找到这样一个(非常)简短的数字列表。可以找到更大的列表

文件识别网站经常还会提到文件的神奇编号

在linux中,该命令可用于识别文件。 在PHP中,可以使用函数集来标识文件


顺便说一下,您没有指定要标识的文件类型。有时,识别可能是错误的解决方案。例如,过去人们希望在将文件传递给GD或将其作为图像保存在服务器上之前识别文件。 在这种情况下,身份识别并不是你真正的工作。相反,请使用以下代码:

$data = file_get_contents('data.dat'); // File might eventcontain a JPG...it is
                                       // still loaded without problems!
$image = imagecreatefromstring($data); // ... since this function just needs the
                                       // file's data, nothing more.

你试过了吗?顺便问一下,为什么不使用这个函数为zip、exe等文件转储$bytes?它只在
PHP>=5.3.0
中受支持。我也希望支持lover版本。出于安全原因,我强烈建议不要使用较旧的PHP版本。这可能会有所帮助:好吧,这总是一场争夺最佳答案的竞赛,不是吗?:)因此,如果我正确理解它,那么
mp3
幻数将是
494433
?是的,但请记住,并非所有以
494433
开头的文件都是实际的mp3文件。嗯,我现在使用的函数没有找到这些数字,而是找到了
ID3
,这有点令人困惑哦,这是
\x49\x44\x33
。这些字节以十六进制表示,相当于ASCII中的
ID3