Binäre Datei auslesen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Binäre Datei auslesen

    Hallo,

    ich würde gerne mal wissen,wie ich eine binäre datei in c auslese.ich weiss dass es funktionen gibt,allerdings ist mir das noch ein wenig schleierhaft.

    ich habe also eine datei im binärformat vorliegen ( hab ich eigentlich garnicht,was mich zu meiner nächsten frage bringt : wie erzeuge ich so eine datei.?wäre nützlich für spätere testzwecke..) und möchte diese nun in einem c programm auslese und zeichenweise analysieren.

    wie würde ich das nun tun?
    wie darf ich mir so eine binärdatei genau vorstellen? eine einfache textdatei mit nullen und einsen? was unterscheidet sie dann von einer TEXTdatei mit nullen und einsen?...ich weiss dass in einer textdatei die nullen und einsen ascii codiert sind.. wie aber kann ich dann die binäre datei auf dem bildschirm sehen/mir anzeigen lassen?


    lg und danke

    scratchy
  • Hi Scratchy,

    auslesen kannst du die genauso wie eine Text-Datei. Du musst nur beim Mode ein "b" für binary angeben.

    Und auf der untersten Ebene endet jede Datei in Einsen und Nullen. Der Unterschied ist, dass eine binär Datei nicht nur lesbaren Zeichen enthält (ASCII Codes) sondern auch Steuerzeichen. Wenn du eine binär Datei also mit einem Editor öffnest, der die als ASCII darstellen will, siehst du nur kryptischen Scheiß. Da hilft dann nur ein Hex-Editor oder ein Programm was die Steuerzeichen interpretieren kann (z.B. Photoshop bei .psd oder .jpg Dateien).

    Gruß,
    X-Eon
  • so.. ich nochmal...

    irgendwie mag mich mein programm nicht.

    ich habe also schön brav ein programm geschrieben,mir alle möglichen seiten zu "fread" und "fwrite" durchgelesen,aber irgendwie möchte mein programm mir einfach keine binäre datei erzeugen,geschweige denn die daten dann wieder hübsch mit "fread" auslesen...

    fwrite schreibt mir meine eingabe ganz normal formatiert in eine datei, weit und breit keine 1 oder 0 zu sehen... was mache ich denn bitte falsch?

    hier ein codeausschnitt:

    Quellcode

    1. y=fwrite(&a[0],sizeof(char),(strlen(a)-1),datei_aus); /*datei_aus = datei in die fwrite schreiben soll*/
    2. printf("%d",y); /*hier hab ich mir den rückgabewert von fwrite ausgeben lassen(erfolgreich eingelesene byte),stimmte auch alles soweit*/
    3. fclose(datei_aus);
    4. datei2=fopen("binaer.bin","rb");
    5. k=0;
    6. while(!feof(datei2)){
    7. fread(&a[k],sizeof(char),(strlen(a)-1),datei2);
    8. k++;
    9. }
    Alles anzeigen


    ich glaub es is schon spät und ich seh vor lauter bäumen den wald nicht mehr...trotzdem wär ich um jede hilfe dankbar.

    lg * schon mal vorsorglich kopf@wand hau*
  • ich weiß nicht ob dir ganz klar ist, was ne binärdatei ist... Wenn du in eine Datei nur Ascii-Zeichen schreibst (selbst im binärmodus) kommt da trotzdem ne Datei raus, die jeder Texteditor problemlos interpretieren kann. Um die Einsen und Nullen zu sehen brauchst du spezielle Software (oder du programmierst es selbst), wobei man binärdaten normalerweise eher im Octal oder Hexadezimalformat betrachtet.
  • mhh...

    achso... also is quasi ne binärdatei das kauderwelsch was ich immer sehe ,wenn ich zb aus spass mal eine exe im texteditor anseh...

    also die sache ist die :

    ich muss einen dissassembler bauen. ich bekomme von jemandem eine .bin und soll diese dann in assemblercode (16bit befehl = 4 bit opcode und 3x4 bit register)rückübersetzen.. so weit so gut...

    also müsst ich theoretisch immer zwei ascii zeichen einlesen ,weil ascii zeichen ja 8 bit lang sind, und diese dann in binärcode "zurückrechnen" um die bitfolge anschließend zu interpretieren ,richtig?


    lg

    ps: aber warum funktioniert mein code nun nicht richtig? sprich warum macht "fwrite" was ich möchte und "fread" macht nichts?=)
  • Quellcode

    1. fread(&a[k],sizeof(char),(strlen(a)-1),datei2);

    ich weiß nicht, wie du a initialisierst, aber wenn a quasi der leere String ist, bevor du fread aufrufst, liefert strlen(a) 0... wenn du davon jetzt noch eins abziehst und der funktion übergibst, hab ich keine Ahnung, was dann passiert.. ;)
    Den fread aufruf find ich eh etwas seltsam... die Schleife erweckt den eindruck, du wolltest das file char-weise auslesen(was erstmal kein Problem ist). Aber dann macht das strlen(a)-1 als Anzahl der gelesenen chars im fread aufruf irgendwie keinen Sinn... Vieleicht überseh ich auch einfach was ;)
  • Was du suchst, nennt man "Unformatierte Ein/Ausgabe". Die Standartbibliothek bietet dafür in den Klassen i/o-stream, i/o-fstream, fstream u.a. die Methoden write() und read(). Ein Beispiel:

    Quellcode

    1. // serialize.hpp:
    2. #ifndef SERIALIZE_HPP
    3. #define SERIALIZE_HPP
    4. #include <fstream>
    5. #include <cstdio>
    6. using std::fstream;
    7. struct FileTable {
    8. char key[40];
    9. char value[40];
    10. unsigned int id;
    11. };
    12. class Serialize {
    13. private:
    14. fstream fStream;
    15. public:
    16. Serialize(const char*);
    17. ~Serialize();
    18. void Write(FileTable&);
    19. int Read(FileTable&);
    20. void SeekHome();
    21. };
    22. #endif
    23. // ----------------------------------------------------------------------------
    24. //serialize.cpp
    25. #include "serialize.hpp"
    26. using namespace std;
    27. Serialize::Serialize(const char *fileName) {
    28. fStream.open(fileName, ios_base::in | ios_base::out | ios_base::trunc);
    29. }
    30. void Serialize::Write(FileTable &table) {
    31. fStream.write((char *) &table.id, sizeof(int));
    32. fStream.write(table.key, sizeof(char) * 40);
    33. fStream.write(table.value, sizeof(char) * 40);
    34. }
    35. int Serialize::Read(FileTable &table) {
    36. fStream.read((char *) &table.id, sizeof(int));
    37. fStream.read((char *) table.key, sizeof(char) * 40);
    38. fStream.read((char *) table.value, sizeof(char) * 40);
    39. return fStream.tellg();
    40. }
    41. void Serialize::SeekHome() {
    42. fStream.seekg(0, ios_base::beg);
    43. }
    44. Serialize::~Serialize() {
    45. fStream.close();
    46. }
    47. // ----------------------------------------------------------------------
    48. // main.cpp
    49. #include <iostream>
    50. #include "serialize.hpp"
    51. using namespace std;
    52. int main(int argc, char **argv) {
    53. Serialize s1("test.txt");
    54. FileTable t1;
    55. t1.id = 2;
    56. sprintf(t1.key, "%-39s\0", "Name");
    57. sprintf(t1.value, "%-39s\0", "Hakon");
    58. s1.Write(t1);
    59. s1.SeekHome();
    60. FileTable t2;
    61. if(s1.Read(t2) >= 0) {
    62. cout << t2.id << endl;
    63. cout << t2.key << endl;
    64. cout << t2.value << endl;
    65. }
    66. else {
    67. cout << "EOF!" << endl;
    68. }
    69. return 0;
    70. }
    Alles anzeigen


    Viel Glück! ;)