如何读取文件的二进制代码(获取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
等......
答案 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);
}