2016-05-27 7 views
-1

Grundsätzlich versuche ich, binäre Daten einer Datei mit fread() zu lesen und drucken Sie es auf dem Bildschirm mit printf(), jetzt ist das Problem, dass, wenn es ausdruckt, es zeigt es tatsächlich nicht als binäre 1 und 0, sondern druckt Symbole und Sachen, von denen ich nicht weiß, was sie sind. DieseWie binäre Daten einer Datei zu kopieren

ist, wie ich es tue:

#include <stdio.h> 
#include <windows.h> 


int main(){ 
    size_t sizeForB, sizeForT; 
    char ForBinary[BUFSIZ], ForText[BUFSIZ]; 

    char RFB []  = "C:\\users\\(Unknown)\\Desktop\\hi.mp4" ;  // Step 1 

    FILE *ReadBFrom = fopen(RFB , "rb"); 

    if(ReadBFrom == NULL){ 
     printf("Following File were Not found: %s", RFB); 
     return -1; 
    } else { 
     printf("Following File were found: %s\n", RFB);        // Step 2 
     while(sizeForB = fread(ForBinary, 1, BUFSIZ, ReadBFrom)){      // Step 1 
      printf("%s", ForBinary); 
     } 
     fclose(ReadBFrom); 

    } 

    return 0; 
} 

würde ich wirklich schätzen, wenn mir jemand helfen könnte aus den tatsächlichen binären Daten einer Datei als binäres (0,1) zu lesen.

+0

Das Öffnen einer Datei im "Binärmodus" bedeutet einfach, dass Sie Rohdaten ohne besondere Behandlung erhalten, wenn Sie davon lesen. Wenn Sie es ausgeben, wird es ausgegeben, was wie Müll aussieht. Wenn Sie möchten, dass es als 0s und 1s ausgegeben wird, müssen Sie etwas Code schreiben, um das zu tun. – kfsone

+2

@Wajid Sie lesen es als binär korrekt. Das Problem besteht darin, dass in C/C++ kein binärer primitiver Datentyp vorhanden ist. Daher wird er normalerweise als Zeichen (8 Bits pro Zeichen) gespeichert. Sie sagen der Laufzeit, diese binären Daten so zu drucken, als ob es eine Zeichenkette wäre, also erhalten Sie die Symbole, weil dies zufällig die Zeichenfolgendarstellung der binären Daten ist, die Sie drucken. Siehe hierzu: [Binär in String umwandeln] (/ questions/2343099/convert-binary-format-string-zu-int-in-c) – Tibrogargan

+0

Wenn Sie eine Arbeit richtig machen wollen, müssen Sie es selbst tun. 'printf' hat keinen Konvertierungsbezeichner, der im Binärformat ausgibt.Sie müssen also eine verschachtelte Schleife schreiben, wobei die äußere Schleife ein Zeichen aus dem Puffer erhält und die innere Schleife das Zeichen konvertiert und als Binärwert ausgibt. – user3386109

Antwort

3
while(sizeForB = fread(ForBinary, 1, BUFSIZ, ReadBFrom)){    
      printf("%s", ForBinary); } 

Dies ist auf vielen Ebenen falsch. Zuerst haben Sie gesagt, dass es sich um eine Binärdatei handelt - was bedeutet, dass möglicherweise kein Text darin enthalten ist, und Sie verwenden den Formatbezeichner %s, der zum Drucken von nullterminierten Strings verwendet wird. Da es sich hier um eine Binärdatei handelt und möglicherweise kein Text darin enthalten ist, ist %s der falsche zu verwendende Formatbezeichner. Und selbst wenn es Text in dieser Datei gibt, sind Sie nicht sicher, ob fread eine "vollständige" null-terminierte Zeichenfolge lesen würde, die Sie mit Formatbezeichner %s an printf übergeben können.

Was Sie möchten, ist, lesen Sie jedes Byte aus einer Datei, konvertieren Sie es in eine binäre Darstellung (google, wie Integer in binäre Zeichenfolge konvertieren, z. B. here), und binäre Darstellung für jedes Byte zu drucken.

Grundsätzlich Pseudo-Code:

foreach (byte b in FileContents) 
{ 
    string s = convertToBinary(b); 
    println(s); 
} 
1

How to view files in binary in the terminal?

Entweder

"hexdump -C yourfile.bin" vielleicht, wenn Sie es natürlich bearbeiten möchten. Die meisten Linux Distributionen haben standardmäßig einen Hexdump (aber natürlich nicht alle).

oder

xxd -b Datei

1

Um einfach eine Datei zu lesen und es in binären (Einsen und Nullen) zu drucken, es eine char zu einem Zeitpunkt lesen. Dann drucken Sie für jedes Bit eine '0' oder '1'. Kann zuerst das Most- oder Least Significant Bit drucken. Schlage MSB vor.

if (ReadBFrom) { 
    int ch; 
    while ((ch = fgetc(ReadBFrom)) != EOF) { 
    unsigned mask = 1u << (CHAR_BIT - 1); // CHAR_BIT is typically 8 
    while (mask) { 
     putchar(mask & ch ? '1' : '0'); 
     mask >>= 1; 
    } 
    } 
    fclose(ReadBFrom); 
} 
+0

Ihre Lösung scheint einfach perfekt zu funktionieren, sie druckt es in 1 und 0, jetzt, wenn ich diese Binärzahl schnappen und in eine TXT-Datei als Text schreiben und sie mit fread() aus dieser Datei zurücklesen will, dann schreibe als neue Binärdaten einer Datei wird es funktionieren. und vielen vielen Dank für Ihre Hilfe – Wajid