mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit sscanf --> Hex


Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi ich hab gerade einen Hänger und komm nicht weiter.

Ich möchte über die Console den Benutzer am PC einen String eingeben 
lassen und daraus eine 16 bit Hex zahl generieren für die Einstellungen 
am µC.

Ich hab mir gedacht dabei einen String mit 4 chars abzufragen und daraus 
dann eine hex zahl zu machen.
Dabei hab ich gerade einen gedanklichen hänger und komme nicht weiter.
Wie erzeuge ich die Hex aus den Chars?
Hilfe mit Code-Bsp wäre super.

Danke.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
strtol

leider gibt es kein strtoi. Aber du bist ja hier nicht zeitkritisch.
Ansonsten: selber machen, ist nicht weiter schwer


* Funktion schreiben, die einen char '0'..'9','A'..'F' in den 
zugehörigen int umwandelt. Darauf aufbauend, dann eine Schleife, die das 
für alle 4 char hintereinander macht und zusmmanmontiert.
Getreu dem Motto:
 die (dezmalzahl) 12 ist auch nichts anderes als 1*10 + 2

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
char text[10] = "abcd";
uint16_t wert;

sscanf(text, "%x", &wert);

Du kannst und solltest allerdings auf sscanf verzichten, da das viel 
Programmcode erzeugt. Den numerischen Wert eines Hex-Digits ermittelst 
Du so:
uint16_t hexdigit(char c)
{
  if (c < '0')
  {
    // fehler!
  }

  if (c > '9')
  {
    if ((tolower(c) < 'a') || (tolower(c) > 'f'))
    {
      // fehler!
    }
  
    return (c - 'a' + 10) 
  }
  return (c - '0');
}


Das musst Du auf jede einzelne Stelle des eingegebenen Strings anwenden 
und das resultierende Nibble entsprechend in Dein Resultat einfügen:
char* text = "12db";
uint16_t wert;

wert = 0;

wert += hexdigit(text[3]);
wert += hexdigit(text[2]) << 4;
wert += hexdigit(text[1]) << 8;
wert += hexdigit(text[0]) << 12;

Autor: Zack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde es einen Tick eleganter formulieren

#define BASIS 16
#define STELLEN 4

char i;
int wert = 0;

for(i=0; i<STELLEN; i++) {
  wert *= BASIS;
  wert += hexdigit(text[i]);
}

Der Compiler weiß selber zu entscheiden, ob er mul oder shift verwendet, 
wenn als Basis 16, 10, 8, .... angenommen werden soll.
Ggf. noch für text[i] einen Pointer verwenden, der inkrementiert wird.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zack schrieb:
> Ich würde es einen Tick eleganter formulieren
>
> #define BASIS 16
> #define STELLEN 4
>
> char i;
> int wert = 0;
>
> for(i=0; i<STELLEN; i++) {
>   wert *= BASIS;
>   wert += hexdigit(text[i]);
> }
>
> Der Compiler weiß selber zu entscheiden, ob er mul oder shift verwendet,
> wenn als Basis 16, 10, 8, .... angenommen werden soll.
> Ggf. noch für text[i] einen Pointer verwenden, der inkrementiert wird.

Und nicht auf 4 Stellen bestehen.

Wenn der Benutzer F85 anstelle von 0F85 eingeben will, dann soll er das 
können, ohne das dies das Programm in Schwierigkeiten bringt.

Autor: Zack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wenn der Benutzer F85 anstelle von 0F85 eingeben will, dann soll er das
>können, ohne das dies das Programm in Schwierigkeiten bringt.

Na ja, soll denn nun auf Ende von text[] getestet werden oder wird text 
so formatiert, dass er immer 4 Stellen lang ist? :-)

Nehmen wir die erste Variante:


char i = 0;
int wert = 0;

while(text[i]) {
  wert *= BASIS;
  wert += hexdigit(text[i]);
  i++;
}

Jetzt fehlt uns aber noch die Fehlerbehandlung für ungültige Zeichen in 
hexdigit().

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.