Announcement

Collapse
No announcement yet.

Binärdateien

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Binärdateien

    Hallo liebe Programmierer,

    ich stehe vor einem großem Problem (für mich)
    Ich versuche ein Programm zu programmieren, das den Kopf einer Mpeg Datei löscht.
    (Aufnahmen von einem Homecast Receiver). Mir ist eigendlich jedes Mittel recht. Ich habe als erstes daran gedacht nur ein Teil der Datei zu kopieren, quasi erst ab dem 1000 Byte oder so. Dazu habe ich auch schon ein Beispiel hier im Forum gefunden. Leider bekomme ich den nicht zum laufen. Ich habe alle falschen Zeichen schon entfernt bzw .ersetzt. Aber ich habe immer noch die Fehlermeldung:

    test.cpp: In function ‘int Binaerdateilesen(char*, char*, long int)’:
    test.cpp:14: error: ‘Quelle’ was not declared in this scope
    test.cpp:14: error: ‘filelength’ was not declared in this scope
    test.cpp:15: error: ‘farmalloc’ was not declared in this scope

    ...und das war der Thread dazu http://entwickler-forum.de/archive/i...hp/t-3515.html

    Die Includes habe ich schon angepasst. Was mache ich also falsch.
    Wenn es auch noch eine Lösung gibt die Mpeg Datei selber zu verändern ohne sie kopieren zu müssen, wäre ich richtig glücklich.

    MfG Marco Klöpfer
    Zuletzt editiert von kingmarco050; 27.02.2007, 19:28.

  • #2
    Wie soll dir einer helfen, wenn DEIN Quelltext nicht da ist??

    Eine Fehlermeldung sagt da wenig.So kann mam eben nur vermuten, dass du irgendwas mit den INCLUDES falsch machst, bzw. mit der Declaration der Variablen und deren Gültigkeitsbereich

    Nein, die Datei muss neu geschrieben werden, egal ob unter einem neuen Namen (kopieren) oder unter dem alten Namen(überschreiben).

    In den Quelltext von Günther kommt jedoch nur ersteres in Betracht, da hier direkt aus einer Datei gelesen wird und gleich in die andere geschrieben wird.

    Eine andere Methode ist, die komplette Datei in den Speicher zu lesen (MPEG ->Größe??) dort die Bytes zu verschieben und dann die Datei wieder zu schreiben. Dann kann man überschreiben

    Des Weiteren heisst das Wort übrigen "wäre"
    Zuletzt editiert von Christian Marquardt; 26.02.2007, 20:24.
    Christian

    Comment


    • #3
      Ich habe ja den Quelltext 1 zu 1 von dem o.g. Link übernommen. Blos die Zeichen die vom HTML "versaut" wurden habe ich berichtigt.
      Aber ist egal. Das ist "mein" kopierter Quelltext:

      #include </usr/include/stdio.h>
      #include <iostream>
      #include </usr/include/linux/io.h>

      int Binaerdateilesen(char *Quelldateiname, char *Zieldateiname, long Startadresse)

      {
      long L;
      long r=L;
      char *Quellarray;
      char *Zielarray;
      FILE *Stream=fopen(Quelldateiname,"rb");
      if(Stream==NULL) return(0);
      L=filelength(fileno(Quelle));
      Quellarray=(char *)farmalloc(L);
      if(Quellarray!=NULL) r=(long)fread(Quellarray,L,1,Quelle);
      fclose(Stream);
      if(r==0L) return(0);
      if(Startadresse>=L) Startadresse=0;
      Zielarray=&Quellarray[Startadresse];
      L-=Startadresse;
      Stream=fopen(Zieldateiname,"wb");
      if(Stream==NULL) return(0);
      fwrite(Zielarray,L,1,Stream);
      fclose(Stream);
      return(1);
      }


      Die Mpeg Dateien sind im Durchschnitt ca. 4 GB gross. Deswegen scheiter auch jeder normale Hex-Editor. Da ist die Speichervariante also kein Alternative.
      Ich erklär auch gerne genau was ich bezwecken will. Mein Digital Receiver mit Festplatte zeichnet die Filme im TS Format auf. Ist auch so üblich. Allerdings schreibt der Receiver in den Kopf der Aufnahme-Datei: Sender, Titel, Datum, Zeit etc. . Wenn ich den Film auf DVD brennen möchte muss ich die Datei replexen oder transcoden. Die Programme haben aber ihre Schwierigkeiten die Datei als Mpeg zu erkennen. Wenn die Aufnahme so gross ist das diese gesplittet werden muss, ist in den gesplitteten Dateien aber der Kopf OK. Diese kann ich auch umwandeln. Aber ein Film ist "beschissen" zu sehen wenn die erste Stunde fehlt. Also daher die Idee den Kopf der ersten Datei zu kürzen. Ab welchem Byte muss ich eben Testen, da ich keinerlei Doku im Netz darüber finden konnte. Achja, die Aufgaben müssen alle von meinen Rechenknecht im Keller (Linux Server) erledigt werden, also alles vorzugsweise in der Bash. Ich gebe natürlich, bei Erfolg, gern das Programm bzw. die stelle des Bytes bekannt ( wenn diese hoffentlich konstant ist ). Mit Hexdump bin ich weit gekommen. Ich kann die Datei aber ja leider nicht bearbeiten. Wer jetzt nen Rechtschreibfehler gefunden hat, darf ihn behalten. Meine finger sind näähhmlich eiskalt.

      Danke schon mal für die schnelle Antwort Christian gestern.
      P.S. Ich weiss nicht welches wäre Du meinst ;-) hihi.
      Zuletzt editiert von kingmarco050; 27.02.2007, 19:54.

      Comment


      • #4
        das fehlt aber

        #include <alloc.h>

        Ähhh. das währe ist weg?!?!?

        Zauber? Welch mächtiger Zauberspruch..
        Christian

        Comment


        • #5
          Jetzt mit alloc.h

          Folgende Fehlermeldung mit Alloc.h


          In file included from /usr/include/c++/4.1.0/backward/alloc.h:46,
          from test.cpp:2:
          /usr/include/c++/4.1.0/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
          test.cpp: In function ‘int Binaerdateilesen(char*, char*, long int)’:
          test.cpp:14: error: ‘Quelle’ was not declared in this scope
          test.cpp:14: error: ‘filelength’ was not declared in this scope
          test.cpp:15: error: ‘farmalloc’ was not declared in this scope


          Danke für die schnelle Antwort

          Comment


          • #6
            Nun sind wir nach x-Beiträgen endlich bei der richtigen Frage, die da lautet

            Mein Linux kennt farmalloc nicht, was ist zu tun?-> ersatz wäre malloc. Funktionen mit far davor werden nicht mehr benötigt -> aus alten 16-Bit Zeiten als der Speicher segmentiert war

            Würde sagen, im Augenblck gar nix, da du mit dem Code von Günther nicht glücklich wirst. Auch dieser liest die komplette Datei in ein Array ein. Für dich mit deinen großen MPEGs nicht zu gebrauchen.

            Du solltest wie folgt vorgegehen:

            Quelldatei öffnen
            Dateizeiger auf das erste Zeichen positionieren, welches du NICHT wegschmeissen willst
            Zieldatei öffnen
            dann entweder blockweise oder Byte für Byte von Quelle nach Zeil schreiben
            Zuletzt editiert von Christian Marquardt; 28.02.2007, 08:50.
            Christian

            Comment


            • #7
              Danke

              Gut, danke. Dann werde ich mal versuchen mir nen Code dafür zu basteln.

              Comment


              • #8
                Hallo Ich mal wieder.

                Bin jetzt eingendlich soweit ganz glücklich. 2 Probleme habe ich dennoch. Ich möchte ger uber die Befehlszeile die Parameter übergeben. Das geht auch soweit. Allerdings nur mit den Namen der Quell- und Zeildatei. Beim Wert (drittes Argument) für den Dateizeiger wird ein "int" Wert verlangt. dir Parameter sind aber "char". Hier der Quellcode

                #include <stdio.h>
                //#include <fstream>
                //#include <iostream>
                #include <iostream.h>
                //#include <string>
                //#include <stdlib.h>
                int DZeiger;
                int main(int argc, char *argv[])


                { FILE *Quelle,*Ziel;
                int i;
                //char fname1[] = argv[1], fname2[] = "U:\\TEST.BAK";
                printf ("Ab Byte?");
                cin >> DZeiger ;
                Quelle = fopen(argv[1],"rb");
                if (Quelle == NULL)
                printf("\n\nQuelldatei nicht geöffnet!\n");
                else
                { Ziel = fopen(argv[2],"wb");
                if (Ziel == NULL)
                printf("\n\nZieldatei nicht geöffnet!\n");
                else

                fseek(Quelle,DZeiger, SEEK_SET);
                { while ((i = fgetc(Quelle)) != EOF)
                fputc(i,Ziel);
                fclose(Ziel);
                }
                fclose(Quelle);
                }
                return 0;
                }

                Zweites Problem: Wenn ich jetzt eine Datei ab dem 23000 (z.B) Byte kopiere geht das nur bis 2GB. Die Quelldatei ist aber ca. 3,5 GB gross und im selben Verzeichniss. Die Fehlermeldung ist folgende:
                "Die maximale Dateigröße ist überschritten"
                Für ein letzte mal an Hilfe WÄRE ich echt voll krass dankbar. Dafür das ich kein C++ kann habe ich mih gut geschlagen finde ich. Wobei ich denke das es mit den fstream und f.write und f.read besser ginge. Achja, wie kann ich die aktuelle Position des Dateizeigers ausgeben? Habe ich nichts drüber gefunden. Oder geht das nur wenn ich den Dateizeiger in der Schleife selber byte für byte setze ?

                Comment


                • #9
                  1. es können nur chars übergeben werden ->ggf. mit atoi umwandeln

                  2. weiss nicht, aber das

                  fclose(Ziel);

                  sollte aus der Schleife raus
                  Christian

                  Comment

                  Working...
                  X