You are not logged in.

  • Login

1

Saturday, June 13th 2009, 11:52am

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

2

Saturday, June 13th 2009, 1:33pm

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

3

Saturday, June 13th 2009, 5:18pm

dankeschön=)

dann versuch ich das mal.

4

Saturday, June 13th 2009, 11:50pm

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:

C/C++ Quellcode

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


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*

5

Sunday, June 14th 2009, 9:49am

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.

6

Sunday, June 14th 2009, 12:09pm

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?=)

7

Sunday, June 14th 2009, 1:36pm

C/C++ 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 ;)

8

Wednesday, June 17th 2009, 10:01pm

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:

C/C++ Quellcode

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


Viel Glück! ;)

9

Sunday, June 28th 2009, 6:11pm

dankeschön=)

Similar threads

Social bookmarks