чтение двоичного кода файла … в PHP

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

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

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

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

5
задан Hash 23 September 2016 в 07:58
поделиться

3 ответа

Файлы действительно хранятся на компьютере в двоичной форме, но единицы и нули хранятся вместе в группах по 8 (называемых байтами). Теперь, традиционно, каждый байт может быть представлен символом ASCII из-за того, что существует 256 возможных значений, которые могут быть представлены в байте, что совпадает с общим количеством различных доступных символов ASCII (это не совпадение но собственно по дизайну).

При этом то, что вы получаете от функции fread , - это то, что вы должны получить: то есть содержимое файла.

Если вы хотите видеть 1 и 0 , вам нужно будет вывести каждый полученный байт в его представление 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);
}

ПРИМЕЧАНИЕ

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

$base2string = '01011010';
$base10value = base_convert($base2string, 2, 10);  // => 132
$ASCIICharacter = chr($base10value);               // => 'Z'
echo($ASCIICharacter);                             // will print Z
12
ответ дан 18 December 2019 в 08:27
поделиться

Ну вот, единицы и нули:

$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);
6
ответ дан 18 December 2019 в 08:27
поделиться

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

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

      $base10value = ord($contents[$i]);
      echo decbin($base10value);
}
1
ответ дан 18 December 2019 в 08:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: