Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

reading binary code of a file...in PHP

Tags:

php

binary

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 .e.g: .txt , .doc , .mp4, .php, .jpg, .png etc....

like image 274
Val Avatar asked Feb 04 '10 14:02

Val


2 Answers

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: i.e. 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
like image 71
Mike Dinescu Avatar answered Oct 27 '22 10:10

Mike Dinescu


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);
like image 31
Heinzi Avatar answered Oct 27 '22 11:10

Heinzi