Chris tian schrieb:
> char str[] = "oui $10 $1C 3<\n><\r>";
strtok könnte man nehmen, ich denke aber, dass es hier mit strchr
einfacher ist, die gewünschte Information zu extrahieren.
mittels strchr nach dem '$' suchen lassen. Du kriegst einen Pointer
zurück, wo das '$' das erste mal zu finden ist, die beiden Zeichen nach
dem $ sind dann deine Hex-Ziffern, die nach bewährtem Muster zur
eigentlichen Zahl zusammengesetzt werden.
Den Pointer, den du von strchr kriegst (wenn er nicht 0 ist), kannst du
dann um 1 erhöht für einen weiteren strchr benutzen. Bzw. durch das
Auslesen der Hex-Ziffern hast du dann sowieso schon automatisch einen
Pointer, den du für den nächsten strchr benutzen kannst.
mal als Skizze:
1 | char str[] = "oui $10 $1C 3<\n><\r>"
|
2 | char* found;
|
3 |
|
4 | ...
|
5 |
|
6 | found = strchr( str, '$' );
|
7 | if( found )
|
8 | {
|
9 | found++;
|
10 | first = toHex( *found++ ) * 16;
|
11 | first += toHex( *found++ );
|
12 |
|
13 | found = strchr( found, '$' );
|
14 | if( found )
|
15 | {
|
16 | found++;
|
17 | scnd = toHex( *found++ ) * 16;
|
18 | scnd += toHex( *found++ );
|
19 | }
|
20 | }
|
21 |
|
22 | ...
|
23 | uint8_t toHex( char c )
|
24 | {
|
25 | if( c >= 'A' && c <= 'F' )
|
26 | return c - 'A' + 10;
|
27 |
|
28 | return c - '0';
|
29 | }
|
du kannst das auch in Schleifen packen, wie es dir beliebt. Aufpassen
musst du nur, dass du die beiden 'Hex-Zusammensetzteile' nicht in eine
Anweisung packen kannst
1 | first = toHex( *found++ ) * 16 + toHex( *found++ );
|
weil hier ein paar Dinge nicht sauber wären. Kurz gesagt ist die
Reihenfolge einiger Operationen so nicht definiert, wohingegen bei 2
Anweisungen
1 | first = toHex( *found++ ) * 16;
|
2 | first += toHex( *found++ );
|
alles sauber und nach den Regeln der Kunst abläuft.
Allenfalls hätte man es noch so schreiben können
1 | ...
|
2 |
|
3 | first = toHex( found[1] ) * 16 + toHex( found[2] );
|
4 | found++
|
5 |
|
6 | ....
|
aber das schenkt sich nicht viel.