Ankündigung

Einklappen
Keine Ankündigung bisher.

Datei manipulieren

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Datei manipulieren

    Hallo zusammen.

    Ich möchte eine Datei welche mit einem Programm auf dem heimischen PC erstellt wurde auf einem Webserver verändern. Dazu benutze ich folgendes Script:
    PHP-Code:
            fwrite($filenew_handle,"Savegame of Billy the Sheep Version 0.76 beta to 0.93 beta");
            
    fwrite($filenew_handle,chr(13)); // Hexwerte in Datei schreiben
            
    fwrite($filenew_handle,chr(10));
            
    fwrite($filenew_handle,chr(13));
            
    fwrite($filenew_handle,chr(10));
            
    fseek($fileold_handle,39); // Dateizeiger auf Position Levelnummer schieben
            
    $level=fread($fileold_handle,1);
            
    $string_length=strlen($level_name[$level-1]);
            
    fwrite($filenew_handle,chr($string_length)); // Im Testlevel 15
            
    fwrite($filenew_handle,chr(0));
            
    fwrite($filenew_handle,chr(0));
            
    fwrite($filenew_handle,chr(0));
            
    fwrite($filenew_handle,$level_name[$level-1]);
            
    fwrite($filenew_handle,chr($level));
            
    // Rest der Datei "kopieren"
            //fseek($fileold_handle,60);
            
    while(!feof($fileold_handle))
                {
                
    $byte=fread($fileold_handle,1); // Ein Byte lesen
                
    fwrite($filenew_handle,chr($byte)); // Gelesenes Byte in gepatchte Datei schreiben
                

    Das ist btw. nicht das gesamte Script, aber der "Drumherumcode" ist nicht weiter interessant, er prüft nur ob die Datei da ist, die neue erstellt wurde, etc. eben. Meines bescheidenen Verständnisses nach sollte das Script die Originaldatei ab Position 39 lesen (die gelesenen Werte stimmen soweit noch), die neue Datei bis zur while-Schleife schreiben und den Rest schlicht kopieren. Und beim kopieren hakts dann ins unendliche. Ich habe dazu mal 2 Screenshots gemacht damit man besser (oder überhaupt ) verstehen kann was ich meine:
    Originaldatei im Hexeditor
    Generierte Datei im Hexeditor

    Wie man sieht werden aus den originalen Werten nur noch Nullen, bis hinter den Text stimmt es aber. Ich verstehe das nicht mehr, kann mir bitte jemand helfen?

  • #2
    Zitat von Hubsi Beitrag anzeigen
    Das ist btw. nicht das gesamte Script, aber der "Drumherumcode" ist nicht weiter interessant
    Doch, eine ganz wesentliche Info hast du uns nämlich vorenthalten - in welchem Modus du die Datei geöffnet hast.
    [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

    Kommentar


    • #3
      Ups, entschuldige Nicht binär, also ohne das b. Ich habe versuchsweise auch mit b herumprobiert, was aber nicht wirklich eine Änderung brachte soweit ich mich bei dem ganzen rumprobieren noch recht entsinne. Ich versuchs aber gleich noch mit binär und dem jetzigen Script. Falls das was ändert editier ich den Post hier nochmal.

      Edit: Binärmodus ändert nichts.

      Kommentar


      • #4
        Zitat von Hubsi Beitrag anzeigen
        Ups, entschuldige Nicht binär, also ohne das b.
        Und was „nicht mit/ohne“ b?

        Modus r,w,a,x; jeweils mit oder ohne + ...?
        [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

        Kommentar


        • #5
          Beides.
          PHP-Code:
          $fileold_handle=fopen("data/savegame.tmp","r");
          $filenew_handle=fopen("data/savegame.".$port,"a"); 
          Oder hast Du etwas ganz anderes gemeint?

          Edit: Einen kleinen Moment, ich muß erst nachschlagen was es mit dem + auf sich hat, so fit bin ich in php nicht

          Kommentar


          • #6
            OK, aber warum du das ganze so umständlich machst, und unbedingt auf Byteebene im Dateisystem rumkriechst, verstehe ich nicht.
            Datei in String einlesen, in String Ersetzung durchführen, Datei mit Stringinhalt überschreiben - das ist doch der übliche Weg für solchen Kleinkram, und auch recht einfach umgesetzt.

            Bei deinem Code fällt mir zunächst nur auf, dass du feof als Abbruchbedingung für die Schleife nehmen willst - feof macht aber m.W. immer wieder Probleme.
            Ich würde einfach das Ergebnis von fread als Bedingung für die While-Schleife nehmen, so lange es noch was liefert, weitermachen ... (Achtung, typsicherer Vergleich erforderlich.)
            [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

            Kommentar


            • #7
              Ich muß auf Byteebene werkeln, da das Windowsprogramm, was die Datei lesen soll, mit Strings nichts anfangen könnte. Gibt es keine Möglichkeit etwas in eine geöffnete Datei "dazwischen zu schieben". Sprich, ich setze den Dateizeiger auf Position, schreibe meinen Kram rein und der restliche Inhalt wird einfach unverändert verschoben? Selfphp macht mir keine großen Hoffungen oder habe ich nur was übersehen?

              Kommentar


              • #8
                Zitat von Hubsi Beitrag anzeigen
                Ich muß auf Byteebene werkeln, da das Windowsprogramm, was die Datei lesen soll, mit Strings nichts anfangen könnte.
                WTF?

                In PHP sind Strings (derzeit) noch nichts anderes, als eine Aneinanderreihung von einzelnen Bytes.

                Und wenn man mit denen vorsichtig umgeht (also immer binary safe), dann sollte es auch problemlos möglich sein, damit Dateien zu erstellen, die andere Systeme problemlos lesen können.

                Gibt es keine Möglichkeit etwas in eine geöffnete Datei "dazwischen zu schieben". Sprich, ich setze den Dateizeiger auf Position, schreibe meinen Kram rein und der restliche Inhalt wird einfach unverändert verschoben?
                Nein, das gibt es nicht.
                Du kannst ggf. einzelne Byte-Positionen überschreiben - aber du kannst nicht eine die Gesamtdateilänge beeinflussende Operation irgendwo mitten drin einbauen.
                [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

                Kommentar


                • #9
                  Habs gerade gemerkt das ich auf dem Holzweg war Ich bin bei der Stringsache etwas verwirrt gewesen, da das gestern bei einem Versuch derbe Probleme machte. Der Tip mit der Stringmanipulation scheint bisweilen zu funktionieren, danke Dir vielmals dafür

                  Kommentar

                  Lädt...
                  X