在PHP中读取文件的二进制代码...

时间:2010-02-04 14:52:48

标签: php binary

如何读取文件的二进制代码(获取1和0)。

$filename = "something.mp3";
$handle = fopen($filename, "rb");
$contents = fread($handle, filesize($filename));
fclose($handle);

我尝试了这个,但它显示了一些奇怪的字符......我认为这是格式化的二进制文件?我本来希望得到1和0。

此外,我不仅仅查看.mp3个文件,它可能是任何内容。例如:.txt.doc.mp4.php,{{1} },.jpg等......

3 个答案:

答案 0 :(得分:12)

文件确实以二进制形式存储在计算机上,但1和0一起存储在8个组中(称为字节)。现在,传统上,每个字节可以用ASCII字符表示,因为有256个可能的值可以用字节表示 - 这恰好与可用的不同ASCII字符的总数一致(这不是巧合)但实际上是按设计)。

话虽这么说,你从fread函数得到的是你应该得到的东西:即文件的内容。

如果您想查看1s an 0s ,则需要将收到的每个字节打印到base 2表示中。您可以使用base_convert之类的功能或编写自己的功能来实现这一目标。

$filename = "something.mp3";
$handle = fopen($filename, "rb");
$fsize = filesize($filename);
$contents = fread($handle, $fsize);
fclose($handle);

// iterate through each byte in the contents
for($i = 0; $i < $fsize; $i++)
{ 
   // get the current ASCII character representation of the current byte
   $asciiCharacter = $contents[$i];
   // get the base 10 value of the current characer
   $base10value = ord($asciiCharacter);
   // now convert that byte from base 10 to base 2 (i.e 01001010...)
   $base2representation = base_convert($base10value, 10, 2);
   // print the 0s and 1s
   echo($base2representation);
}

如果你有一个1s和0s的字符串(一个字符的基数2表示),你可以将它转换回如下字符:

$base2string = '01011010';
$base10value = base_convert($base2string, 2, 10);  // => 132
$ASCIICharacter = chr($base10value);               // => 'Z'
echo($ASCIICharacter);                             // will print Z

答案 1 :(得分:6)

在这里,1和0:

$filename = "something.mp3";
$handle = fopen($filename, "rb");
$contents = fread($handle, filesize($filename));
for ($i = 0; $i < strlen($contents); $i++) {
    $binary = sprintf("%08d", base_convert(ord($contents[$i]), 10, 2));
    echo $binary . " ";
}
fclose($handle);

答案 2 :(得分:1)

为什么不使用PHP函数decbin

for($i = 0; $i < $fsize; $i++){

      $base10value = ord($contents[$i]);
      echo decbin($base10value);
}