HEX- Datei einlesen
-
Hallo Zusammen,
ich möchte zeilenweise eine Hexdatei einlesen.
Eine zeile sieht zb so aus::020000040000FA
Ich habe mich für den "CStdioFile" weg entschieden, und ich bekomme über die Funktion
CString datastr; ... file.ReadString(datastr);
einen String.
a) Wie dividiere ich diesen String auseinander?
b) Wie sorge ich dafür, das die HexZeilen auch richtig rerauchkommen?
zur Erklärung:
nach dem Doppelpunkt bilden immer Zwei ziffern die Hex- Zahl
hier::020000040000FA
entspricht:
0x02, 0x00, 0x00,...,0xFABin für jede Antword dankbar.
Gruß
Claus
PS.:
Ein teil der Frage gehört eigentlich in das forum C++, aber ich dachte, das es vieleicht eine Klasse in CFile gibt, die einen teil bereits unterstützt...
Habe sie aber nicht gefunden...
-
a) substring()
b) siehe C++ FAQ (sscanf(sub,"%x",&int); sollte den Teilstring sub als Hex-Zahl interpretieren)
-
a) substring()
b) siehe C++ FAQ (sscanf(sub,"%x",&int); sollte den Teilstring sub als Hex-Zahl interpretieren)Substring() gibt es bei mir nicht.
Es handelt sich um einen CString wie kann ich den in ein char konvertieren?erwartet nicht sscanf ein const *char und nicht ein CString?
Bin etwas durcheinander....
Substring () ist ein Member der String Klasse, richtig?
wie kann ich dafür sorgen, das ich diese Funktion nutzen kann?Ich habe den CString und wie mache ich daraus ein char, damit ich auch sscanf benutzen kann?
-
Bei CString heißt die Methode Mid, nicht substring. In const char * umwandeln brauchst du nicht, das geht automatisch.
-
-
Danke schön!!
PS.:
Auch für die grammatikalische Einlage...
-
Ich habe da noch ein Problem:
Mid liefert mir einen CString zurück und den kann ich in dieser Art nicht
weiterverarbeiten, ich brache char.
Wie kann ich CString zu einem Array of char machen ?
-
*grübelt* CString hat doch einen "operator LPTCHAR()" (oder so) der den String bei Bedarf als char* interpretiert.
-
????
SO nun bin ich wirklich verwirrt...
wenn CString einen operator LPTCHAR() hat, dann könnte man wie vorgehen...
ich muss nochmal nachlesen was Du konkret meinst...
-
du könntest auch einfach mal den relevanten Code posten ...
-
CM_HT schrieb:
wenn CString einen operator LPTCHAR() hat, dann könnte man wie vorgehen...
ich muss nochmal nachlesen was Du konkret meinst...Dann kann man den String (bzw. Teilstring) direkt dort angeben, wo ein konstantes Char-Array benötigt wird (z.B. als ersten Parameter für sscanf()).
(LPTCHAR ist ein WinAPI typedef für char* bzw. wchar_t*)
-
ja:
void CPIC_ProgrammerDlg::Zeilen_conv(CString str) { int i, length; CString zw; length = str.GetLength(); for(i=0;i<length;i++) { zw= str.Mid(i,2); scanf(zw,"%c",databuf[i]); i++; } }
Es geht um folgendes:
Ich habe ein *.hex -File das ich zeilenweise einlesen will.
die zeilen können so aussehen::020000040000FA
Dabei lese ich diese Zeile ein und mit lasse das ":" verschinden
read = file.ReadString(datastr); datastr = datastr.Mid(1);
das übrige darastr wird der oben aufgeführten Funktion übergeben.
da jeweils 2 ziffern eine hex- zahl darstellen soll diese mit .Mid
zerlegt werden und in einen Buffer geschrieben werden, damit diese als
Zahl weiterverarbeitet werden können.
-
versuch's mal mit
for(i=1;i<length;i+=2) { zw= str.Mid(i,2); scanf(zw,"%c",databuf[i]); }
Startwert 1 - das erste Zeichen ist ja der Doppelpunkt, den du vermutlich nicht mitlesen willst.
Schrittweite 2 - überspringt jedes zweite Zeichen der Hex-Sequenz.
-
hm müsste in der schleife i nicht um 2 erhöht werden, wenn du immer 2 Zeichen liest?
-
ja sollte es,
ist auch ein fehler, aber darum geht es erstmal nicht.
ich habe gerade strcpy () versucht aber hier sagt er mir,
dass die Konvertierung von CString in Char nicht geht
-
wozu brauchst du denn strcpy?
-
to CStoll
for(i=1;i<length;i+=2) { zw= str.Mid(i,2); scanf(zw,"%c",databuf[i]); }
Er gibt mir zwar kein kompiler Fehler aus, aber der databuf bleibt leer.
-
Ist dir klar, dass scanf von der Konsole einliest? Du meinst nicht sscanf?
-
*args* So genau habe ich auch nicht hingeguckt. Ich dachte, den Teil hättest du schon "unter Kontrolle".
sscanf(zw,"%x",&(databuf[i])); /* 1. 2*s im Funktionsnamen 2. %x für Hex-Darstellung 3. Adresse des Ziels */
-
Perfekt!!!
vielen dank nochmal!!hier der code wie er läuft:
int i, length; CString zw; length = str.GetLength(); for(i=1;i<length;i+=2) { zw= str.Mid(i,2); sscanf(zw,"%x",&databuf[i]); }
Good job!!!