图像文件中的EOF字符

时间:2016-04-27 14:59:22

标签: php

在对问题check manually for jpeg end of file marker ffd9 (?) in php to catch truncation errors的回复中,jpg的EOF字符显示为 的 “\ XFF \ xD9”即可。 当我使用它时,脚本会捕获看似有效的jpgs,而如果我删除'x'字符则允许它们。 x的目的是什么,如果省略它们是否重要?

$imgdata = fopen($uploadfile, 'r'); // 'r' is for reading
fseek($imgdata, -2, SEEK_END); // move to EOF -2
$eofdata = fread($imgdata, 2);
fclose($imgdata);
switch ($mimetype) {
    case "image/jpeg":
        $eof = "\xFF\xD9";
        break;
    case "image/pjpeg":
        $eof = "\xFF\xD9";
        break;
    case "image/png":
        $eof = "\60\82";
        break;
}
if ($eofdata != $eof) {
    $valid = false;
}

1 个答案:

答案 0 :(得分:3)

在PHP字符串文字中,\x用于表示您以十六进制输入字符代码。因此"\xFF"是一个字符串,其字符具有十六进制代码FF,即十进制255

如果您遗漏\x"FF"是一个字符串,其中包含两个F个字符。

请参阅字符串documentation中的PHP转义码的完整列表。

如果它无法正常工作,请确保字符串用双引号括起来,而不是单引号。 What is the difference between single-quoted and double-quoted strings in PHP?

我检查了一些JPEG文件,EOF标记并不总是在文件的末尾。如果您想确保文件没有被截断,请在文件的任何位置搜索它,而不仅仅是在文件末尾。

$contents = file_get_contents($uploadfile);
if (strpos($contents, $eof) === false) {
    $valid = false;
}

根据Wikipedia,这实际上不是EOF序列,它是图像结束标记。如果文件中有多个图片细分,则会多次出现 - 每张图片都被FFD8 图片的开头FFD9 图片的结尾<包围/ strong>即可。

另见JPEG EOF vs EOI marker