简体   繁体   中英

reading binary code of a file…in PHP

How can I read the binary code(to get the 1s and 0s) of a file.

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

I tried this but it shows some strange characters... I presume that this is the formated binary? I was hoping to get the 1's and 0's instead.

Also I am not looking only .mp3 files it could be anything .eg: .txt , .doc , .mp4 , .php , .jpg , .png etc....

Files are stored on the computer in binary form indeed, but the 1s and 0s are stored together in groups of 8 (called bytes). Now, traditionally, each byte may be represented by an ASCII character because of the fact that there are 256 possible values that can be represented in a byte - which happens to coincide with the total number of different ASCII characters available (this was not a coincidence but actually by design).

That being said, what you are getting back from the fread function is what you're supposed to get: ie the contents of the file.

If you want to see the 1s an 0s you will need to print each byte that your receive into it's base 2 representation. You can achieve that using a function such as base_convert or by writing your own.

$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);
}

NOTE

If you have a string of 1s and 0s (the base 2 representation of a character) you can convert it back to the character like so:

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

Here you go, the 1s and the 0s:

$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);

Why not use the PHP function decbin ?

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM