Textdatei binaer einlesen
-
Hallo!
Ich schlage mich hier schon seit einer Weile mit einem Problem rum: Ich hab hier eine Textdatei, welche einen dump einer seriellen Schnittstelle enthaelt. Das ist also ein kontinuierlicher Datenstrom aus Bytes:
7e0113c0c42205050000000088015151002a06002a0600000069637e 7e0113c0c4880c0c1414220022011616002a06002a06002828763e7e 7e0113c0c4880c0c1212220022011616002a06002a0600282807627e 7e0113c0c4880c0c1010220022011616002a06002a0600282828567e ...Ich moechte das nun wieder einlesen - und zwar nicht als ASCII-Zeichen sondern halt byteweise - so, dass ich die Werte, die in der Textdatei stehen, quasi direkt in den Speicher kopiere.
int main() { char buffer[100]; ifstream myFile("raw232.log", ios::in | ios::binary); myFile.read(buffer, 100); }Das oben funktioniert nicht, da es die Zeichen als ASCII einliest. Das erste Byte, dass ich haben will, soll buffer[0] = 7e sein. Stattdessen kriege ich buffer[0] = '7', buffer[1] = 'e' usw usw.
Wie kriege ich das binaer eingelesen?
-
Dein Programm macht genau das was du ihm sagst. Es liest die Datei binär ein. Was du willst, ist nicht binäres Einlesen, sondern formatiertes Einlesen als zweistellige Hexadezimalzahlen. Das ist ein völliger Unterschied!
Hier mal einen kurzen Code, welcher dir das allgemeine Vorgehen verdeutlichen soll:
#include <sstream> #include <iostream> int main() { std::istringstream iss("0a0b0c"); std::stringstream ss; char buffer[2]; int value; while(iss.read(buffer, 2)) { ss.clear(); ss.write(buffer, 2); ss >> std::hex >> value; std::cout << value << '\n'; } std::cout.flush(); return 0; }Statt des
std::istringstreamverwendest du einfach deinstd::ifstream. Wobei du noch Spezialzeichen wie Newline oder Carriage Return rausfiltern müsstest.Grüssli
-
Dann hast du offensichtlich keinen Bytestrom, sondern einen hex-codierten ASCII-Strom. Da ist ein bisschen umwandeln nötig:
int main() { char buffer[3]; ifstream myFile("raw232.log", ios::in | ios::binary); int bytewert; myFile.get(buffer, 3); sscanf(buffer,"%X",&bytewert); }Ungetestet, sollte aber funktionieren.