PHP ... bir dosyanın ikili kodlarını okumak

3 Cevap php

Nasıl bir dosyanın ikili kodu (1'ler ve 0'lar almak için) okuyabilirsiniz.

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

Bu çalıştı ama bazı garip karakterler gösterir ... ben bu format ikili olduğunu tahmin ...? Ben 1 adlı almak umuduyla ve 0 yerine 'oldu ....

also i am not looking only .mp3 files it could be anything .e.g: .txt , .doc , .mp4, .php .jpg,.png etc....

Teşekkürler

3 Cevap

Dosyaları gerçekten ikili formda bilgisayarda depolanan, ancak 1'ler ve 0'lar 8 (adlandırılır bayt) gruplar halinde birlikte saklanır. (Bu bir tesadüf değildi mevcut farklı ASCII karakter sayısı ile denk olur - Şimdi, geleneksel olarak, her bayt çünkü bir bayt temsil edilebilir 256 olası değerler olduğu gerçeği bir ASCII karakteri ile temsil edilebilir ama aslında tasarım).

Söyleniyor, ne geri fread işlevinden alıyorsanız almak zannediyorsunuz budur: dosyanın içeriğinin yani.

Eğer see the 1s an 0s you will need to print each byte that your receive into it's base 2 gösterimi istiyorum. Bunu başarmak için böyle base_convert olarak veya kendi yazarak bir işlevi kullanarak.

$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

Eğer 1'ler ve 0'lar (bir karakterin baz 2 temsili) bir dize varsa bunu gibi karakteri geri dönüştürebilirsiniz:

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

Burada, 1s ve 0s gidin:

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

Neden PHP işlevi kullanmayın DECBIN

{(;; $ i $ fsize <$ i + + = 0 $ i) için

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

}