使用哪个PHP函数将二进制文件读入字符串?

20

如何使用PHP函数将二进制文件读入字符串?

3个回答

30

file_get_contents 已经足够好了。它似乎以二进制模式读取文件。我写了一个小的 PHP 脚本来检查这一点。没有出现 MISMATCH 消息。

<?php

foreach (glob('/usr/bin/*') as $binary) {
    $php = md5(file_get_contents($binary));
    $shell = shell_exec("md5sum $binary");
    if ($php != preg_replace('/ .*/s', '', $shell)) {
        echo 'MISMATCH', PHP_EOL;
    }
    else {
        echo 'MATCH', PHP_EOL;
    }
    echo $php, '  ', $binary, PHP_EOL;
    echo $shell, PHP_EOL;
}

以下注释来自手册

注意:此函数是二进制安全的。


这是最好的答案。+1 为提供测试。干得好。 - Larry K

19

你正在寻找 fread 函数。

fread — 读取文件并确保二进制安全

示例:

$filename = "c:\\files\\somepic.gif";
$handle = fopen($filename, "rb");
$contents = fread($handle, filesize($filename));
fclose($handle);

注意:

在区分二进制文件和文本文件的系统上(例如 Windows),必须在 fopen() 的模式参数中包含 'b',以打开该文件。


2
这里重要的部分是在fopen()中的 b 标志。 - Álvaro González

1

试试这个

$handle = @fopen("/path/to/file.bin", "rb");
if ($handle) {
    while (!feof($handle)) {
        $buffer[] = fgets($handle, 400);
    }
    fclose($handle);
    $buffer[0][0] = chr(hexdec("FF")); // set the first byte to 0xFF
}
// convert array to string 

7
为什么要将第一个字节设为0xFF? - Poonam Bhatt
1
在Windows下,这段代码会将文件作为纯文本处理,并且可能会破坏您读取的内容。 - Álvaro González
1
感谢Shakti Singh和Álvaro G. Vicario。 - Poonam Bhatt
4
你应该使用'rb'而不是'r'调用fopen()函数,这样它会将内容作为二进制而不是文本读取。 - samoz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接