чтение двоичного кода файла ... в PHP - PullRequest
5 голосов
/ 04 февраля 2010

Как я могу прочитать двоичный код (чтобы получить 1 и 0) файла.

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

Я пробовал это, но он показывает некоторые странные символы ... Я предполагаю, что это форматированный двоичный файл? Я надеялся получить 1 и 0 вместо этого.

Также я не смотрю только .mp3 файлов, это может быть что угодно .eg: .txt, .doc, .mp4, .php, .jpg, .png и т. Д. *

Ответы [ 3 ]

12 голосов
/ 04 февраля 2010

Файлы хранятся на компьютере в двоичном виде, но 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);
}

Примечание

Если у вас есть строка 1 и 0 (базовое представление 2 символа), вы можете преобразовать ее обратно в символ следующим образом:

$base2string = '01011010';
$base10value = base_convert($base2string, 2, 10);  // => 132
$ASCIICharacter = chr($base10value);               // => 'Z'
echo($ASCIICharacter);                             // will print Z
6 голосов
/ 04 февраля 2010

Вот, пожалуйста, 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);
1 голос
/ 22 апреля 2010

Почему бы не использовать функцию PHP decbin?

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

      $base10value = ord($contents[$i]);
      echo decbin($base10value);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...