mikrocontroller.net

Forum: Compiler & IDEs Hex ASCII -> Int


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Vermutlich ist es peinlich aber ich kann die Lösung nicht finden:
Ich habe einen String (char-Array) mit einem Hex-Wert, den will ich in
einer INT-Variablen speichern

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sscanf (unelegant, da die ganze scanf/prinft-Library gelinkt werden
muss)

strtol sollte in stdlib.h enthalten sein:

long strtol(const char *nptr, char **endptr, int base);

Dank des "base"-Arguments kann man die zu verwendende Radix angeben,
hier also 16.

Beipspiel:

   char   *string, *stopstring;
   long   l;

   string = "feedcode";
   l = strtol(string, &stopstring, 16);

   printf("string = %s\n", string);
   printf("   strtol = %ld\n", l);

Ob man auf das stopstring-Argument verzichten kann, ist mir jetzt nicht
ganz klar; in diesem Pointer wird jedenfalls ein Pointer auf den auf die
ausgewertete Zahl folgenden String geliefert. Bei obigem Beispiel müsste
der demnach auf die terminierende Null der Stringkonstanten verweisen.

Sinn vonn't janze ist beispielweise sowas:


   char   *string, *stopstring;
   long   l1, l2;

   string = "feedcode deadface";
   l1 = strtol(string, &stopstring, 16);

   printf("string = %s\n", string);
   printf("   strtol = %ld\n", l1);

   string = stopstring;

   l2 = strtol(string, &stopstring, 16);

   printf("   strtol = %ld\n", l2);

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, ich wußte, doch, daß es a) was einfaches ist und ich b) das auch
schon mal gesehen hatte. Kopp wie Sieb

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf stopstring kann man verzichten, allerdings kann man sich dann
nicht mehr sicher sein, ob die Konvertierung wirklich OK war oder eine
reale 0 geparst worden ist.

Autor: Mem (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich greife mal diesen Thread auf, da er GENAU mein Problem beschreibt.
Hab mich schon wund gesucht, die letzten 2 Tage.
Und alle Lösungen, die ich gefunden habe funktionieren leider nicht, so 
auch diese:
Beispiel:

   uint8_t  stringLength        = 0;
   uint8_t  StrBuf[50];
   long test = 99;  // ascii dezimal c
   stringLength = sprintf((char *)StrBuf, "Test: %2X \n\r", test);
   uart_put(USART_CHANNEL1, StrBuf, stringLength);

^^ Hiermit wird schön: "Test: 63" (also ascii hex von c) ausgegeben.
Nun will ich c als char in das ascii hex umwandeln und ausgeben.

Beispiel 2:
   uint8_t  stringLength        = 0;
   uint8_t  StrBuf[50];
   char test[] = "c";
   stringLength = sprintf((char *)StrBuf, "Test: %2X \n\r", test);
   uart_put(USART_CHANNEL1, StrBuf, stringLength);

^^funktioniert nicht

Beispiel 3:
   uint8_t  stringLength        = 0;
   uint8_t  StrBuf[50];
   char* teststring;
   teststring = "c";
   long test;
   test = strtol(teststring, NULL, 16);
   stringLength = sprintf((char *)StrBuf, "Test: %2X \n\r", test);
   uart_put(USART_CHANNEL1, StrBuf, stringLength);

^^funktioniert ebenfalls nicht und auch noch zig Variationen mit z.B. 
atoi gehen nicht.

Hoffe mir kann jemand helfen.

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich Programmiere mir das immer selber, ist irgendwie kleiner als alles 
andere was in der libc drin ist:
int hexatoi(char *in){
  int value=0;
  unsigned char i=0;
  while(1){
    if(in[i] >= '0' && in[i] <= '9'){
      value <<= 4;
      value |= in[i] - '0';
    }
    else if(in[i] >= 'A' && in[i] <= 'F'){
      value <<= 4;
      value |= in[i] - 'A'+10;
    }
      else if(in[i] >= 'a' && in[i] <= 'f'){
      value <<= 4;
      value |= in[i] - 'a'+10;
    }
    else
      break;
    i++;
  }
  return value;
}

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was willst du denn eigentlich überhaupt machen?

Beipisl 2 ist sicher daneben da du ja wohl nicht die adresse des Strings 
ausgeben willst
Beispiel 3 müsste c (dezimal 12) als wert ausgeben

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach ja, wenn du longs ausgeben willst gehört dazu ein l im Formatstring 
..

Autor: Mem (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Timmo H.
habe es mit deiner Funktion versucht, leider kommt dabei auch nur eine 0 
oder ein c heraus.

@Walter
Was ich machen will, habe ich unter Beispiel 1 geschrieben.
Und für den long hab ich eben das X genommen, da ich ja den ascci-hex 
wert ausgeben will.
Nochmal: Ich will einfach den ascii-hex Wert eines char ausgeben.
In diesem Fall c >> 63

gruß

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Mem
Dann hast du was falsch gemacht. Denn wenn ich folgenden Code Kompiliere 
gibt er "AFFEDEAD" aus:
int hexatoi(char *in){
  int value=0;
  unsigned char i=0;
  while(1){
    if(in[i] >= '0' && in[i] <= '9'){
      value <<= 4;
      value |= in[i] - '0';
    }
    else if(in[i] >= 'A' && in[i] <= 'F'){
      value <<= 4;
      value |= in[i] - 'A'+10;
    }
      else if(in[i] >= 'a' && in[i] <= 'f'){
      value <<= 4;
      value |= in[i] - 'a'+10;
    }
    else
      break;
    i++;
  }
  return value;
}


int main(){
  int wert;
  char test[] = "AFFEDEAD";
  wert = hexatoi(test);
  printf("%X",wert);
}
Wenn du das mit "0x..." übergibst, musst du halt den Pointer 
inkrementieren:
int main(){
  int wert;
  char test[] = "0xAFFEDEAD";
  if(test[1] == 'x')
    wert = hexatoi(test+2);
  else
    wert = hexatoi(test);
  printf("%X",wert);
}

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dann musst du schreiben:
   teststring = "c";
   test = *teststring;
   stringLength = sprintf((char *)StrBuf, "Test: %2X \n\r", test);

Grüße
Walter

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Womit dann gleich wieder ganze Printf-Lib dazugrlinkt wird. Unnützer 
Ballast, wenn man die Funktionen ansonsten nicht braucht.

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.