Koken: Datei bitweise lesen

Hallo zusammen,

ich möchte (für eine Verschlüsselung) eine beliebige Datei bitweise einlesen, sodass ich eine folge aus Nullen und Einsen durchgehen kann.

Das einzige was ich bisher gefunden habe sind Lösungen, die nicht funktionieren oder wie man Binärdateien einliest. Das hilft mir aber nicht weiter.

ich hoffe ihr könnt mir weiterhelfen, ich danke im Voraus.

lieber Grüße,
Koken

  1. Hallo zusammen,

    ich möchte (für eine Verschlüsselung) eine beliebige Datei bitweise einlesen, sodass ich eine folge aus Nullen und Einsen durchgehen kann.

    Ich würd byteweise einlesen und jedes Byte konvertieren...

    1. Ich würd byteweise einlesen und jedes Byte konvertieren...

      danke, aber wie konvertiere ich ein byte dann?

      1. danke, aber wie konvertiere ich ein byte dann?

        Habe ich eigentlich dazu geschrieben.
        Das ist die Schleife.

        mfg Robert

        1. Vielen Dank schonmal,

          danke, aber wie konvertiere ich ein byte dann?

          Habe ich eigentlich dazu geschrieben.
          Das ist die Schleife.

          mfg Robert

          Das bezog sich noch auf den Post davor.

          Leider kommt nichts dabei raus. Soweit ich das verstehe liest du die Datei (byteweise) ein und bekommst einen String, den du in achterblocks unterteils (bei meiner Probe-Textdatei "Das ist ", "die Test-"...) diese versucht du jetzt als Binär zu interpretieren und als Dezimalzahl auszugeben...

          Vielleicht noch einmal das Ziel etwas genauer:
          Eine beliebige Datei, also ein Textdatei, ein Bild oder eine Exe soll bit für bit eingelesen werden (ich erwarte also einen String der etwa so aussieht: 01001101110...)

          Ich kann eine Datei Byte für Byte einlesen (z.B. Buchstabe für Buchstabe) Was mir fehlt ist eine Funktion, die daraus dann die Bitfolge macht z.B.
          a => 00100110
          vielleicht muss ich eine ASCII-Tabelle abtippen? aber dann komme ich doch z.B. bei Bilddateien nicht weiter?

          1. Leider kommt nichts dabei raus.

            Au man, nichst für ungut also noch mal.

            Soweit ich das verstehe liest du die Datei (byteweise) ein und bekommst einen String, den du in achterblocks unterteils (bei meiner Probe-Textdatei "Das ist ", "die Test-"...) diese versucht du jetzt als Binär zu interpretieren und als Dezimalzahl auszugeben...

            $code = file("datei");
            Dies liest die ganze Datei ein und speichert jede 1 und jede 0 und die Endekennung deines Textdokument in die Variable code[0].

            Die Unterteilung davon in Bytes erfolgt danach mit
            $array1 = str_split($code[0],8);
            Hier wird ein array erzeugt das für jedes achte Zeichen einen neuen key erhält.

            z.B.:
            Inhalt der Textdatein: 00100100010010111101010110101011 ...
            So würde das Array folgendermaßen aussehen:
            array1
            (
              [0] => "00100100"
              [1] => "01001011"
              [2] => "11010101"
              [3] => "10101011"
              [4} => "..."
            )

            Vielleicht noch einmal das Ziel etwas genauer:
            Eine beliebige Datei, also ein Textdatei, ein Bild oder eine Exe soll bit für bit eingelesen werden (ich erwarte also einen String der etwa so aussieht: 01001101110...)

            Es ist zwar kein string sondern ein array aber dies is für die folgende Funktion nnützlicher, denn jetzt musst du nur eine einfache foreach Schleife schreiben um jedes Byte ein mal anzufassen.

            Ich kann eine Datei Byte für Byte einlesen (z.B. Buchstabe für Buchstabe) Was mir fehlt ist eine Funktion, die daraus dann die Bitfolge macht z.B.
            a => 00100110

            siehe das Array!

            vielleicht muss ich eine ASCII-Tabelle abtippen? aber dann komme ich doch z.B. bei Bilddateien nicht weiter?

            und die Ascii-Tabelle musst du nicht aptippten es gibt nur keine Umwandlung vom typ binär to ascii, aber decimal to ascii und ebenfalls existiert ein funktion binär to decimal.
            Also schlussfolgerung daraus wenn ich meinen string aus einem Speicherfeld des Arrays (ein Byte) umwandeln möchte muss ich den Wert erst in decimal zahlen system umrechnen (bindec()) und dann kann ich ihn per chr() in das Ascii format umwandeln.

            So mit ergeibt sich pro Arrayfeld folgende Formatierung:

              
            echo chr(bindec($array1[0]));  
            echo chr(bindec($array1[1]));  
            echo chr(bindec($array1[2]));  
            echo chr(bindec($array1[3]));  
            echo chr(bindec($array1[...]));  
            
            

            Dies geht dann aber in der foreach-Schleife intiligenter:
            foreach($array1 as $value)
            {
                echo chr(bindec($value));
                echo " ";
            }

            mfg Robert

            1. Leider kommt nichts dabei raus.
              Au man, nichst für ungut also noch mal.

              Soweit ich das verstehe liest du die Datei (byteweise) ein und bekommst einen String, den du in achterblocks unterteils (bei meiner Probe-Textdatei "Das ist ", "die Test-"...) diese versucht du jetzt als Binär zu interpretieren und als Dezimalzahl auszugeben...

              $code = file("datei");
              Dies liest die ganze Datei ein und speichert jede 1 und jede 0 und die Endekennung deines Textdokument in die Variable code[0].

              Ja, genau da liegt das Problem. Das ist nämlich leider NICHT so, wie du es sagst: Es erscheinen KEINE Einsen und Nullen, sondern schon die fertigen Strings in Buchstaben.

              Die Unterteilung davon in Bytes erfolgt danach mit
              $array1 = str_split($code[0],8);
              Hier wird ein array erzeugt das für jedes achte Zeichen einen neuen key erhält.

              z.B.:
              Inhalt der Textdatein: 00100100010010111101010110101011 ...
              So würde das Array folgendermaßen aussehen:
              array1
              (
                [0] => "00100100"
                [1] => "01001011"
                [2] => "11010101"
                [3] => "10101011"
                [4} => "..."

              Da der Inhalt der Textdatei über die Funktion file() so ausgelesen wird:
              "Hallo, das ist eine Test-Datei zum ..."
              Also NICHT nur Nullen und Einsen, sieht der Array, tatsächlich - ich habe es ausprobiert! - so aus:

              array1
              (
                [0] => "Hallo, d"
                [1] => "as ist e"
                [2] => "ine Test"
                [3] => "-Datei z"
                [4} => "..."

              Deine Funktion liefert, ich habe sie unverändert ausprobiert, nur eine leere Ausgabe. Was ich aber benötige ist ein String der Form "010010110..." Als Ergebnis. (du läufst irgendwie falsch-herum)
              Den du hier als durch file("test.txt") gegeben annimmst. So leicht ist es leider nicht. Oder läuft liefert die Funktion bei dir das gewünschte Ergebnis? Liegt es dann an Servereinstellungen?

              Vielen Dank für eure Mühe, Koken

              1. So, ich habe mittlerweile die Lösung gefunden (xhtmlforum.de):

                  
                	$fp = fopen($filename, 'rb');  
                	$content = fread($fp, filesize($filename));  
                	fclose($fp);  
                	for($i=0;$i < strlen($content);$i++)  
                		{  
                		for($b=0;$b<8;$b++)  
                			{  
                			echo (((1 << $b) & ord($content[$i])) > 0)?'1':'0';  
                			}  
                		}  
                
                

                danke an alle, die es versucht haben! Vielleicht könnt ihr mir noch helfen den Code zu verstehen? Was genau machen << und & im allgemeinen?

                (eine Bezeichnung unter der ich googeln kann reicht schon, mit << und & zu suchen ist nur sinnlos)

                1. danke an alle, die es versucht haben! Vielleicht könnt ihr mir noch helfen den Code zu verstehen? Was genau machen << und & im allgemeinen?

                  (eine Bezeichnung unter der ich googeln kann reicht schon, mit << und & zu suchen ist nur sinnlos)

                  auch hier kann ich mir selbst die Antwort geben (Entschuldigung, dass ich dann erst so doof frage):

                  << ist der Shift operator, der bitweise nach links verschiebt

                  00000001 << 1 = 00000010 << 1 = 00000100

                  und & ist bitweises Und

                  10010111
                  & 01011001
                  -----------
                    00010001

                2. So, ich habe mittlerweile die Lösung gefunden (xhtmlforum.de):

                  $fp = fopen($filename, 'rb');
                  $content = fread($fp, filesize($filename));
                  fclose($fp);
                  for($i=0;$i < strlen($content);$i++)
                  {
                  for($b=0;$b<8;$b++)
                  {
                  echo (((1 << $b) & ord($content[$i])) > 0)?'1':'0';
                  }
                  }

                    
                  Ah, ok, dann haben wir an einander vorbei geredet, ich dachte du willst eine Datei decodieren die so Aufgebaut ist.  
                  Und halt aus dem Binärcode einen Text machen und nicht umgekehrt.  
                    
                  Also nochmal mein Code ist zum DEcodieren.  
                    
                  Sorry, mein Fehler.  
                  mfg Robert
                  
          2. Hi Koken!

            Eine beliebige Datei, also ein Textdatei, ein Bild oder eine Exe soll bit für bit eingelesen werden (ich erwarte also einen String der etwa so aussieht: 01001101110...)

            Du möchtest also eine beliebige Datei als Binärzahl haben?

            Könntest du erläutern, was genau du vorhast.
            Einzelne Bit in einem Byte abzugreifen, sollte ja nicht allzu schwer sein.
            Aber was willst du dann damit anstellen?

            MfG H☼psel

            --
            "It's amazing I won. I was running against peace, prosperity, and incumbency."
            George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
            Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
            1. Einzelne Bit in einem Byte abzugreifen, sollte ja nicht allzu schwer sein.

              Ich weiß leider nicht wie, genau das ist meine Frage.

              Aber was willst du dann damit anstellen?

              Wie bereits erwähnt geht es mir um eine Verschlüsselung, die php nicht mitbringt. Diese Verschlüsselung findet eben auf Bit-ebene statt, es führt also keine Weg daran vorbei. wie es dann weitergeht ist dann auch weniger problematisch.

      2. Hi there,

        danke, aber wie konvertiere ich ein byte dann?

        ganz einfach. Nehmen wir an, Dein Zeichen sei 'A', dann

        steht in  decbin(ord('A')) das binäre Äquivalent von 'A' drinnen ('1000001')

        soll heissen, du durchläufst einfach jedes einzelen Zeiche Deiner Datei und wendest auf jedes dieser Zeichen die beiden Funktionen decbin(ord($zeichen)) geschachtelt an...

  2. Einfach

      
    $code = file("datei");  
    
    

    und dann kannst du den "gegen Algorithmus" zur verschlüsslung auf code[0] einsetzen und dann halt per

      
    $array1 = str_split($code[0],8);  
    foreach($array1 as $value)  
    {  
        echo chr(bindec($value));  
        echo " ";  
    }  
    
    

    wieder in Zeichen umsetzen

  3. Hi,

    ich möchte (für eine Verschlüsselung) eine beliebige Datei bitweise einlesen, sodass ich eine folge aus Nullen und Einsen durchgehen kann.

    Klingt so, als ob du selber "was basteln" willst ...?

    Wenn ja, würde ich empfehlen, vorher das hier zu lesen:
    Einfache PHP-Verschlüsselung? Die 100-Euro-Wette.

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.