String ASCII in Binaer Modus in Datei abspeichern



  • Hallo!

    ich möchte einen Textstring in einem Binärmodus d.h. als Binärzahl (nicht-abdruckbare Zeichen) in eine Datei schreiben, weiß leider nicht wie das geht. Ähnlich wie beim Komprimieren.
    Gibt es ein Casten zwischen char und binary types oder Shiften von Bites? Ich bin für jede Hilfe dankbar.

    Gruß
    kjesse



  • kjesse schrieb:

    Gibt es ein Casten zwischen char und binary types oder Shiften von Bites? Ich bin für jede Hilfe dankbar.

    Da gibt es in C keinen Unterschied.

    int i = 'A'; // ist in C keine Problem.
    

    Du solltest aber beim Öffnen der Datei den Binärmodus mit angeben.
    Du solltest auch mit fwrite und fread arbeiten.

    Shiften kannst du mit << bzw. >>



  • Anders gefragt: wie erzeuge ich aus abdruckbaren Zeichen (ASCII) binär (gepackte) Zeichen, die die Output Datei kleiner machen und nicht lesbar sind? In COBOL gibt es das Feld PACKED DECIMAL. Die Datenmenge ist dort reduziert und kann wieder entpackt werden.



  • Kein Chance mit Standard C Funktionen, im Rahmen eines Einzeilers wäre ein simples XOR Verschlüsseln machbar (ohne Komprimierung).



  • Packed decimal ist keine String-, sondern eine dezimale Zahlenkodierung - MSB, zwei dezimale Ziffern pro Byte, fixed point. Geht es speziell um Zahlen in String-Repräsentation, die komprimiert gespeichert werden sollen? Bist du auf packed decimal festgelegt?

    Prinzipiell kann man Folgendes machen:

    char const *str = "1234";
    int x;
    FILE *fd;
    
    fd = fopen("data.bin", "w");
    sscanf(str, "%d", &x);
    fwrite(&x, sizeof(int), 1, fd);
    

    und später wieder einlesen:

    FILE *fd;
    int x;
    char str[100];
    
    fd = fopen("data.bin", "r");
    fread(&x, sizeof(int), 1, fd);
    snprintf(str, 100, "%d", x);
    

    Das ist dann stumpf die Repräsentation von x im Speicher in eine Datei rausgeschrieben. Es ist im Interesse der Plattformunabhängigkeit sinnvoll, die Breite der Datentypen und den Bytesex festzulegen, etwa int32_t zu benutzen und per htonl bzw. ntohl die Zahl vor dem Schreiben nach network byte order (MSB) und hinterher wieder zurück zu konvertieren.



  • Vielen Dank für die Hinweise. Eigentlich will ich einen Hashcode fürs Komprimieren "binär" erzeugen und als nicht-abdruckbares Zeichen in eine Datei (textdatei) ausgeben. Ich habe gesehen dass man den Datentyp "uint16_t" verwenden kann d.h. maximal 16 Bits sind zulässig. Schreibt man dann mit fprintf(..."%u",hash) usw.? Es wird mein erster Kompressor, daher habe ich noch nicht soviel Erfahrung, wie man binär schreibt in C.



  • fprintf() schreibt in Textform, wenn du mit puren Binärdaten arbeiten willst, sind fwrite() und fread() das, was du benötigst (so wie seldon demonstriert hat).



  • fprintf(..."%u",hash) schreibt lesbare Zeichen.

    Du suchst wahrscheinlich fwrite

    fwrite(&hash,sizeof(hash),1,...);
    


  • Super. Danke. Ich denke es funktioniert jetzt.


Log in to reply