检查二进制图像数据

时间:2012-11-22 19:16:30

标签: php binaryfiles

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

具体来说,这就是我正在使用的功能:

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等...如果某处有某种列表,那将会很棒,尽管我想提取它我自己并了解这一切是如何运作的。

3 个答案:

答案 0 :(得分:4)

您要找的是file magic number

幻数是文件签名的类型 - 因为有时需要超过幻数来识别文件。

可以找到here这样的(非常)短的这些数字列表。可以找到更大的列表here

文件识别网站经常也提到文件幻数。

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


顺便说一下,您没有指定要识别的文件类型。有时,识别可能是错误的解决方案。例如,人们过去想要在将文件传递给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.

答案 1 :(得分:3)

您要找的是“文件签名”,“ Magic Bytes ”或“ Magic Numbers ”。

This page列出了很多文件格式

但是,我不会依赖它们来识别文件格式。 改为使用PHP's finfo_file

答案 2 :(得分:2)

大多数文件都有一个特定的标题文件签名或(显然)幻数,它们是同一个东西的不同名称:a在文件开头的固定字节集。

例如,.exe starts with 'MZ'.zip has a fixed 4 byte sequence

此网页包含大量文件签名: http://www.garykessler.net/library/file_sigs.html

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