binären String in Zahlen auslesen
-
Dieser Thread wurde von Moderator/in estartu aus dem Forum MFC (Visual C++) in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Habe ich das richtig verstanden, das deine Datei zB so aussieht:
0000 0000 0001 1010 ...Ausgabe:
1. Wert : 26?
-
Hi!
Also mit dem Reinterpret-cast funktioniert nun das lesen, aber leider immer noch nicht richtig (ich bekommen nicht die richtigen werte heraus. vielleicht liegt das aber auch daran, dass ich vorher falsch lese:
ich habe nämlich eine text-datei, in der vorher etwa 10 zeilen "normaler" Text, also in ASCII steht, diese Zeilen hole ich mit getline heraus und dann fängt erst das binäre Lesen an. Das ganze sieht so aus:fin.open(cs,ios::binary); if(!fin) cout<<"Fehler!"<<endl; getline(fin,header); cout<<header<<endl; string title; getline(fin,title); cout<<title<<endl; string datatype,geometry,dimensions,origin,spacing,pointdata,scalars,lookuptable; getline(fin,datatype); getline(fin,geometry); getline(fin,dimensions); getline(fin,origin); getline(fin,spacing); getline(fin,pointdata); getline(fin,scalars); getline(fin,lookuptable);//last line in ASCII cout<<lookuptable<<endl; //nach dieser Zeile fangen Binärdaten an for(int i=0;i<7;i++) {float wert; fin.read(reinterpret_cast<char*>(&wert), sizeof(float)); cout<<"Wert: "<<wert<<endl; }Die Werte sollten zwischen 4000 und 20000 liegen und ich bekomme aber auch negative..
liegt das am code, fange ich falsch an zu lesen? kann ich denn überhaupt mit getline lesen, wenn ich die datei im binärmodus geöffnet habe? es funktioniert, ich bekomme damit was ich will, aber ändere ich vielleicht implizit an dem öffnugsmodus etwas?lg,
Iso
-
tja, ich glaube helfen wird ohne eine genauere darstellung der datei (z.b. hexdump) nicht möglich sein, also zeig mal, WAS du genau lesen willst.
-
Ich kopiere mal einen Teil der Datei in Codeform hier hinein:
# vtk DataFile Version 2.0 s3cfa1-u2 t 1866.0106 BINARY DATASET STRUCTURED_POINTS DIMENSIONS 259 425 393 ORIGIN 0.0 0.0 0.0 SPACING 758978.0 980032.0 979968.0 POINT_DATA 43259475 SCALARS t float 1 LOOKUP_TABLE default E•!ªE•«vE–úE–ƒE–öE—\ E—ÅÃE˜?&E˜µIE™4²E™Æ“EšmàE›"óE›è÷EœÃÀE¹4EžÍEŸúÁE¡G[E¢«FE¤*tE¥ÌLE§‘(E©~/E«‰‘E`E°éE²ÆEµ£_E¸¿GE¼ZEEÀjÀEÅ3XEÊÍEÒ dEÛ’PEèdas file ist noch länger, aber der Rest ist ebenfalls binär wie die letzten 3 Zeilen, da ändert sich dann nicht mehr viel.
Tatsache ist, dass ich die ersten 10 Zeilen, die ja in ASCII geschrieben sind, mit getline auslese, das funktioniert ganz gut. dann steht mein reader bei der ersten Zeile, die binär kodiert ist und dann lese ich mit float und einem buffer von 4 byte immer 4 byte aus. Prinzipiell funktioniert das auch, aber es kommen einfach nicht die richtigen Zahlen heraus, die in dem File drinnen stehen sollten.
lg,
Iso
-
Mein erster Gedanke und aus Zeitmangel nicht weiter verfolgt:
Nach dem Einlesen der ersten Zeilen hast du ja die Position in der Datei im Stream stehen. Merk dir die, öffne die Datei dann erneut im binären Modus und spring an die Stelle. Dann sollte es gehen. Denke ich zumindest.

-
klingt gut, aber welches flag muss ich denn anhängen, um den DateiReader an eine bestimmte stelle zu setzen? ich finds einfach nicht im netz. und wie kann ich die position des Readers in einem offenen Stream feststellen?
lg,
Iso
-
-
thx, also die position bestimmten und dann dort weiterlesen funktioniert. ich bekomme allerdings dieselben zahlen heraus, die ich auch vorher bekommen habe, als ich einfach weitergelesen habe.
langsam bin ich echt verzweifelt!
kann es sein, dass da irgendwelche leerzeichen dazwischen stehen oder so, sodass ich nach 4 byte etwas rausnehmen muss?lg
Iso
-
Ist die Bytereihenfolge denn richtig?
-
?? kann sie denn falsch sein?
-
Nicht unbedingt falsch, sondern eher anders.
Hast du denn mal die eingelesenen Bytes mit den erwarteten verglichen?
-
ok, es war das byteordering. ich sie waren im bigEndian gespeichert und ich wollte mit littleEndian auslesen..
Vielen Dank für deine Hilfe!!
lg,
Iso