Binäre Daten auslesen

Nach der while-Schleife wäre ein
C#:
return ms.GetBuffer();
praktisch, sonst wirds nix. (Nichtmal mit kompilieren. ;) )

Habts euch schonmal den BinaryReader angesehen?

lg, wsl

Edit: Ach.. vergessts das mit dem return.. habs schon gefunden in deinem Code. *g*
 
Danke, das hat jetzt super geklappt nur leider verstehe ich immernoch nicht den ganzen Hintergrund..
Also, ein Double hat 8 Byte, soweit weiss ich bescheid. Ich weiss auch wo diese 8 Bytes liegen. Nur wie und warum werden die jetzt umgeformt?
Werden die Bytes aneinandergekettet und dann umgeformt? Oder wird jedes einzelnd umgeformt und danach zusammengehängt!?
Und für den Fall das auf einmal Text drin stünde, würde der dann auch gelesen?
Ich versteh dieses ganze "als byte speichern" Prozedere nicht und auch nicht wie es dann nun letztendlich ausgelesen wird. Wäre nett wenn ihr mir hier nochmal nachhelfen würdet :)

Mh und der BinaryReader sieht auf den ersten Blick auch sehr nütlich aus. Ich steig nur zu wenig durch das Thema durch um das jetzt umwandeln zu können ;(
 
Zuletzt bearbeitet:
ha, cool, ich hab vor kurzem eine Anwendung geschrieben die Binary Reader heißt :)

tschuldigung, in meinem code kommt deswegen die Zahl raus, weil ich ulong statt double als Datentyp genommen hab. Tausche einfach alle ulongs durch double aus, dann müsste es stimmen.


Und jetzt nochmal zu dem binären auslesen, speichern, ...

Wenn man Zahlen speichern will, dann bietet sich das binäre an, weil man ja nicht pro Zahl ein byte braucht, sondern damit platzsparend Zahlen speichern kann. Wenn man z.B. 2354 speichern will, dann wäre das mit dem File.WriteAllText(); 4 bytes. Wenn man aber 2354 in binärcode umwandelt (was dann 0000100100110010 wäre, wenn die übersetzung stimmt) dann brauche ich nur 2 bytes. Das ist um 50% Platzsparender. Deswegen lohnt sich so etwas. Allerdings wird dadurch das schreiben und lesen etwas komplizierter. Man muss die Zahl erst in einen 16 - Bit Datentyp speichern (hier bietet sich ushort an), und dann in zwei byte Datentypen zerlegen. Man verschiebt dazu alle Bytes dieses Datentyps um 8 nach links. Dabei fallen die restlichen stellen einfach weg. Nach dem Beispiel von oben währe dann 2354 >> 8 == 9. Warum? Weil das Byte nach links verschoben wird. Das ist das erste Byte das geschrieben werden soll. Das zweite Byte soll die andere hälfte sein. Das geht mit (byte). Dabei fallen die letzten stellen weg. Das auslesen funktioniert genau andersherum. Man liest die beiden Bytes, und setzt das erste und das zweite Byte zusammen. Das geht mit
Code:
ushort result = (ushort)((byte1 << 8) | byte2)
Das erste byte wird um 8 nach links verschoben, und das zweite hintendrangesetzt.

Zufälligerweise bin ich sogar dabei, ein Tutorial über dieses Thema zu schreiben :)
 
Zuletzt bearbeitet:
Nur wie und warum werden die jetzt umgeformt?
Die Umformung erledigt ja die Klasse "BitConverter". Wenn du wissen willst, wie ein double in den 8 Bytes gespeichert wird, solltest du mal einen Blick auf den Link werfen, den ich in meiner ersten Anwort gepostet hatte. Da es sich um eine Gleitkommazahl handelt, ist die Umformung schon etwas komplexer als nur Bytes aneinanderketten.

Und für den Fall das auf einmal Text drin stünde, würde der dann auch gelesen?
Solange der BitConverter 8 Bytes vorgesetzt bekommt, versucht er diese zu wandeln. Falls diese Bytes keinen Double repräsentieren, kommt entweder Murks raus oder es wird eine Exception erzeugt.

Ich versteh dieses ganze "als byte speichern" Prozedere nicht und auch nicht wie es dann nun letztendlich ausgelesen wird
Eigentlich nur eine normale Routine, um eine Datei lesen. Da diese ja keinen Text enthält wird sie binär gelesen, d.h. ohne jegliche Interpretation der Daten. Für die Ablage solcher Daten ist ein byte-Array der sinnvolle Weg, zumal das ja auch als Quelle für den BitConverter benötigt wird.

Gruß
MCoder
 
Ich hab mir nochmal den BinaryReader angeguckt und das war wirklich ein guter Tip :)
Dort klappt es mit weniger Zeilen Code für mein Verständnis genausogut :)

Code:
FileStream fs = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read);

            BinaryReader r = new BinaryReader(fs);

           
             textBox1.Text = r.ReadDouble().ToString();
            
            r.Close();
            fs.Close();
 
Dein Code bearbeitet die ersten 8 Bytes der Datei. Wenn der Bereich weiter hinten steht, müsstest du den Stream noch entsprechend positionieren.

Gruß
MCoder
 
Ja mh du hast recht das ist mir auch vorhin aufgafellen.
Wie kann man denn den Stream positionieren?
 
Mh sorry das ich hier bei jedem bisschen nachfrage aber ich hab jetzt ne gute halbe Stunde gegoogelt und ausprobiert und steig nicht durch.

Was genau muss in die Klammer von Seek?
Ich kenn es nur von Mid wo man zuerst Position und dann die Länge angibt aber so wird mir irgendwie immer eine Fehlermeldung ausgegeben. :confused:
 

Neue Beiträge

Zurück