Benutzer mit den meisten Antworten
Binärdatei lesen

Frage
-
Hallo, ich habe folgendes Problem:
Ich möchte eine Binärdatei über den BinaryReader einlesen. In der Datei stehen XYZ-Koordinaten und IJK-Gitterknotenindizes (also 6 Spalten pro Datenpunkt).
Wenn ich die Datei lese kommt allerdings nur Mist dabei raus. Ich habe als Vergleich die Koordinaten auch in einer Textdatei stehen.
Wo könnte das Problem liegen? Was muss ich dabei beachten?
Ich habe verschiedene Datentypen ausprobiert aber nie kommen sinnvolle Werte raus.
4576625 5676445 -101.88559722900391 0 0 0 4576675.5 5676445 -101.88559722900391 1 0 0 4576726 5676445 -101.88559722900391 2 0 0
Wie sollte ich da vorgehen ?
System.IO.BinaryReader br = new BinaryReader(stream); List<float> l_numbers = new List<float>(); while(br.BaseStream.Position < br.BaseStream.Length - 16) { l_numbers.Add(br.ReadSingle()); }
So kommen zum Beispiel keine sinnvollen Werte raus.
Antworten
-
Bin selbst auf die Lösung gekommen.
Habe jetzt einfach jeweils 4 bytes eingelesen, die in ihrer reihenfolge vertauscht und dann mit BitConverter.ToSingle(newByteArray,0) die richtigen werte raus bekommen.
- Als Antwort markiert Christian.Bertram Mittwoch, 20. April 2011 14:22
Alle Antworten
-
Hallo V.,
das kommt auf die Codierung (und Reihenfolge / Wert-Semantik,Größe / Position) der Binärdatei an (Spezifikation?), die uns hier noch unbekannt ist.
Es "könnte" ja zum Beispiel auch "ReadDouble()" (also 8 Byte, anstatt Dein 4 Byte Single) benutzt werden müssen.
Ggf. sollte Du einmal die Bytes einzeln dahingehend in der Datei untersuchen.
ciao Frank -
Hallo vegi,
am einfachsten dürfte es sein, wenn du deine Koordinaten in einer Klasse/Struktur speicherst und deren instanzen dann durch .net serialisieren lässt. Infos zum Serialisieren findest du hier -->(http://msdn.microsoft.com/de-de/library/ms233843.aspx).Viele Grüße
Holger M. Rößler -
Also ich kenne das genaue Format nicht, ich schreibe die Datei nicht selbst.
Scheinbar ist es aber ein BigEndian-Format und ich habe ein anderes Programm gefunden das die gleichen Binärdatei liest.
Erst wird folgendes gesetzt:
lib.SetMemoryByteOrder(BigEndian);
valueSize = sizeof(float);
tupleFloat = new float[NumberOfComponents];
int readNumber = 256;
unsigned char* c = new unsigned char[valueSize*readNumber];dann wird untenstehende Funktion aufgerufen:
...
lib.Byte2IeeeSingleFloatUnion(c+i*valueSize, &tupleFloat[component]);
...
int component = 0; int cr = 1; while (cr>0) { if (readNumber>remaining/valueSize) { readNumber = remaining/valueSize; } cr = fread(c, valueSize, readNumber, _file); remaining -= cr*valueSize; for (int i=0; i<cr; i++) { lib.Byte2IeeeSingleFloatUnion(c+i*valueSize,&tupleFloat[component]); component++; if (component == NumberOfComponents) { if (_mode == ModeFloat) { _array->InsertNextTuple(tupleFloat); } if (_mode == ModeDouble) { _array->InsertNextTuple(tupleDouble); } if (_mode == ModeShort) { charArray->InsertNextTupleValue(c+i); } component=0; } } }
int LibNumber::Byte2IeeeSingleFloatUnion(unsigned char bytes[4], float * IeeeSingleFloat) { union Ieee4Bytes u; if( _memoryByteOrder == LittleEndian ) { u.b[0] = bytes[0]; u.b[1] = bytes[1]; u.b[2] = bytes[2]; u.b[3] = bytes[3]; } else // BigEndian { u.b[0] = bytes[3]; u.b[1] = bytes[2]; u.b[2] = bytes[1]; u.b[3] = bytes[0]; } *IeeeSingleFloat = u.f; return 0; }
Wenn ich als Encoding-Typ für den BinaryReader BigEndianUnicode angebe und mir ReadSingle() die Zahlen auslese funktioniert das ganze aber nicht. (Weil es kein Unicdoe ist ? )
Die ausgegebene Zahlen stimmen nicht,
es wird sowas wie das hier ausgegeben(für die im 1. post genannten zahlen):
[0] -1.57299166E+21 float
[1] 0.0007159306 float
[2] 7.65185938E+27 float
[3] 87830.58 float
[4] 0.0007159306 float
[5] 7.65185938E+27 float2 zahlen wiederholen sich also immer wieder
Jemand eine Idee?
bzw.
Wie kann ich 4 bytes in einen Float umwandeln?
-
Bin selbst auf die Lösung gekommen.
Habe jetzt einfach jeweils 4 bytes eingelesen, die in ihrer reihenfolge vertauscht und dann mit BitConverter.ToSingle(newByteArray,0) die richtigen werte raus bekommen.
- Als Antwort markiert Christian.Bertram Mittwoch, 20. April 2011 14:22
-
Hallo V.,
Wenn die Datei BigEndian ist, gibt es zum Beispiel folgende Lösungsmöglichkeiten:
[How to read a float from a Big Endian binary file.]
http://social.msdn.microsoft.com/forums/en-US/csharplanguage/thread/117c265b-5727-4bcf-88ca-b6c2192f26b5
ciao Frank