Zamiana znaków na wartości binarne

0

Witam,

muszę napisać program który będzie "pakował" pliki wszelkiej maści (od *.doc po *.exe). Chcę go zrobić w PHP. Mam jednak problem z konwersją wczytanych danych do wartości binarnych. Oto co mam teraz:

Chodzi mi o to czy jest funkcja którą mogę zamienić z decbin()

<?

$plik = file_get_contents('plik.txt'); // wczytanie pliku tutaj na sztywno ustalony plik tekstowy

echo 'Wejscie: '.$plik.'<br>'; // wartość pliku

$plik = str_split($plik); //konwersja string do tablica

$ile = count($plik); // zliczanie elementów tablicy

echo 'ile: '.$ile.'<br>'; // testowe wyświetlenie ilości 

for($a=0;$a<=$ile;$a++)
{
$znak = decbin($plik[$a]); // ta funkcja działa jedynie dla liczb

$dlugosc_znaku = strlen($znak); //sprawdzanie długości ciągu w celu obliczenia ilości zer do dopełnienia (muszą być 4 znaki 1010, 1000, itp)
if($dlugosc_znaku == 4) echo $znak; 
if($dlugosc_znaku == 3) echo '0'.$znak;
if($dlugosc_znaku == 2) echo '00'.$znak;
if($dlugosc_znaku == 1) echo '000'.$znak;
echo '<br>';
}

?>
0

Pytanie zasadnicze: czy wiesz że wartości binarne to nie są jedynki i zera, w dodatku w reprezentacji znakowej? Pakując w ten sposób zwiększasz rozmiar pliku 8 razy. Co ci nauczyciele informatyki wam tam nagadali, masakra...

Ślepota boli:

See Also
* bindec() - Binary to decimal

Jak zwykle strona manuala dla "decbin".

0

Ten kod co podałem nie jest dokończony. Trzeba w nim jeszcze dodać funkcję sumującą takie same wartości obok siebie (np. ABBBBCDDE => ABB2CDDE). Wiem, że funkcja bindec() służy jedynie do konwersji dziesiętny->dwójkowy. Szukam takiej dla: znaki -> dwójkowy.

OK mam:

$b = "";
for($i=0;$i<strlen($plik);$i++){
$b .= sprintf("%08s ",decbin(ord($plik[$i])));
}

Kolejny problem:

Jak zapisać plik jako binarny? Teraz przy zapisie 0 i 1 po otworzeniu w edytorze z podglądem "Binary" każdy znak jest zapisywany jako 00110000 lub 00110001 - jak zrobić by było albo samo 0 albo sama 1ka ?

0

http://en.wikipedia.org/wiki/Binary_file

To co ty spłodziłeś to jakaś marna reprezentacja liczbowa, a nie prawdziwy zapis binarny. Teoretycznie każdy plik tym pociągnięty w "twojej" reprezentacji fizycznie zostanie powiększony 8 razy jeśli rozpiszesz każdy bajt na liczbę i zapiszesz to jako normalne znaki do pliku.

Masz sobie jakiś znak chr(1) - ten znak waży jeden bajt. Teraz bierzesz jego ordinal - 1 i zamieniasz go na liczbę w reprezentacji binarnej. Według twojej modły wychodzi 00000001. I co dalej? Zapisujesz to wszystko jako normalne znaki. W takim wypadku jeden bajt jest reprezentowany przez 8 znaków, czyli 8 lub 16 bajtów zależnie od kodowania. Jak nie trudno policzyć bawiąc się w ten sposób plik ważący 10MB rozpiszesz na 80MB albo i więcej. Cały ten cyrk z decbinem i formatowaniem wyjściowej liczby jest NIEPOTRZEBNY.

0

Czyli rozumiem, że nie da się z poziomu PHP zapisać tego normalnie jako wartości binarne ?

0

To co ty robisz to nie jest normalne zapisywanie tylko jakieś dziwne kombinacje, które z zapisywaniem binarnym mają tyle wspólnego co krzemień z mazakiem.
Przeczytaj jak wyglądają pliki binarne - na tym poziomie to to ma niezbyt wiele wspólnego z jakimiś jedynkami i zerami. To co czytasz z pliku źródłowego to są właśnie wartości binarne. I nie wydziwiaj z ordinalami, sposobem zapisu liczby i jeszcze nie wiem czym bo to standardowo bezcelowe kombinowanie.

Mały eksperyment: Otwórz notatnik, zapisz w nim ciąg znaków: "00000001 00000001" i podejrzyj dowolnym hexedytorem jak to faktycznie wygląda. Dostajesz znaki, nie bajty.

1 użytkowników online, w tym zalogowanych: 0, gości: 1