Binary Datei öffnen?



  • Ich möchte mir ein kleines Prog schreiben, dass eine Art Binary zu einem Lesbaren TXT macht. Das So genannte "Binary" benutzt nämlich nur Zeichen, die es eigentlich gar nicht gibt. Am besten ich poste einfach mal was ich gemacht habe...

    elektranox@erde:~/Desktop$ less test.cafix
    "test.cafix" may be a binary file.  See it anyway? y
    
    <E2>0^M0^NC~D^M<F7>^X^M<F7>^P1,1,":::::::::::::::::::::"^M<F7>^P1,3,":::::::::::::::::::::"^M<F7>^P5,2,"BINOMI<87>RECHNER"^M
    ^M<F7>^P1,4,"(A<89>B)<8B>      [1]"^M<F7>^P1,5,"(A<99>B)<8B>      [2]"^M<F7>^P1,6,"(A<89>B)<89>(A<99>B) [3]"^M<F7>
    ^M^?<8F>^NC^M<F7>^KC^Q72^?<B0>C^Q62^?<B0>C^Q52^M<F7>^X^MC=72^S<EC>1^MC=62^S<EC>2^MC=52^S<EC>3^M<E2>1^M"(A<89>B)<8B>"^M"A"?^NA^M"B"?^NB^M<F7>^X^M<F7>^P1,1,"(A<89>B)<8B>"^M<F7>^P1,2,"A<8B><89>2AB<89>B<8B>"^MA<8B><89>(2<A9>(A<A9>B))<89>B<8B>^NC^M<F7>^P1,3,"ERGEBNIS:"^M<F7>^P10,3,C^M<F7>
    ^M^?<8F>^ND^M<F7>^KD=0^M<EC>0^M<E2>2^M"(A<99>B)<8B>"^M"A"?^NA^M"B"?^NB^M<F7>^X^M<F7>^P1,1,"(A<99>B)<8B>"^M<F7>^P1,2,"A<8B>
    <99>2AB<89>B<8B>"^MA<8B><99>(2<A9>(A<A9>B))<89>B<8B>^NC^M<F7>^P1,3,"ERGEBNIS:"^M<F7>^P10,3,C^M<F7>
    ^M^?<8F>^ND^M<F7>^KD=0^M<EC>0^M<E2>3^M"(A<89>B)(A<99>B)"^M"A"?^NA^M"B"?^NB^MA<8B><99>B<8B>^NC^M<F7>^X^M<F7>^P1,1,"(A<89>B)(A
    <99>B)"^M<F7>^P1,2,"A<8B><99>B<8B>"^M<F7>^P1,3,"ERGEBNIS:"^M<F7>^P10,3,C^M<F7>
    ^M^?<8F>^ND^M<F7>^KD=0^M<EC>0<FF>
    test.cafix (END)
    

    Diese Datei erzeugt mir Cafix von meinem Taschenrechner. Die <> Teile müssten geändert werden 🙂 Also dachte ich mir ein kleines C Prog zu machen, welches mir das dann immer erledigt ^^ Leider geht das aber nicht so... Mein Programm:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <pwd.h>
    
    int main()
    {
      int fh;
      char *file;
      char data[500]="\0";
    
      file = "test.cafix";
    
      if((fh=open(file, O_RDONLY))== -1) {
    		printf("Couldn't open the cafix file!\n");
    		return 0;
      }
        else
      {
        if((read(fh, &data, sizeof(data))) == -1)
        {
          printf("Couldn't read the cafix file!\n");
          printf("Wrong permissions?\n");
          return 0;
        }
        else
        {
          printf("%s", data);
          printf("\n\n\n");
        }
      }
    
      return 0;
    }
    

    Die Ausgabe: Datensalat! Was mache ich falsch? Eigentlich müsste die Ausgabe doch wie in "less" sein 😞

    Edit 1: *RTFM Thread les* Ich arbeite mit dem gcc unter Linux Ubuntu Dapper 6.04 und mein Wissenstand ist Anfänger 😉 Gefunden habe ich noch nichts, wäre für jeden Tipp dankbar 🙂

    Edit 2: Nen Bild vom Programm



  • nimm fopen mit "rb"

    read will nicht &data sondern data...

    data enthaelt dann binaerdaten. die kannst du nicht mit printf ausgeben, weil zu binaerdaten auch \0 gehoert, woran printf naemlich das stringende erkennt. binaerdaten sind keine strings. printf gibt dann eventuell nicht alles aus.



  • Also mein neues Programm:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <pwd.h>
    #define ZEILENLAENGE 80
    
    int main()
    {
      FILE *fh;
      char *file;
      char data[500]="\0";
      char puffer[ZEILENLAENGE];
    
      file = "test.cafix";
    
      fh = fopen(file, "rb");
    
      if(fh == NULL) {
    		printf("Couldn't open the cafix file!\n");
    		return 0;
      }
      else
      {
        while(fgets(puffer,ZEILENLAENGE,fh))
        {
          fputs(puffer,stdout);
        }
      }
    
      return 0;
    }
    

    Meine gleichbleibende Ausgabe:

    elektranox@erde:~/Desktop$ ./execute
    ÷1,6,"(A‰B)‰(A™B) [3]":::::"
    ÷C
    ÷10,3,CRGEBNIS:"
    ÷D
    ÷10,3,CRGEBNIS:"
    ÷D
    ÷10,3,CRGEBNIS:""
    ÷D
    ì0ÿ␊┌␊┐├⎼▒┼⎺│@␊⎼␍␊:·/D␊⎽┐├⎺⎻$
    

    P.S.: Gibts irgendeinen Befehl um die Binary Zeichen zu ASCII Zeichen zu konventieren? Also wie z.B. in less? Die jetzige Ausgabe ist übrigens exakt die gleiche wie die von More ^^



  • Warum liest du eine Binärdatei zeilenweise (fgets)?

    Binärdateien liest man normalerweise mit fread.



  • Ritter schrieb:

    Warum liest du eine Binärdatei zeilenweise (fgets)?

    Binärdateien liest man normalerweise mit fread.

    Ok ich hab das Problem gelöst erstmal per fread einlesen und dann mit nem switch umwandeln 🙂


Anmelden zum Antworten