mikrocontroller.net

Forum: Compiler & IDEs Wie wandelt ich Dez in Hex um?


Autor: Monika Clinton (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Wie kann ich einen Dezimalwert in einen Hexadezimalwert umwandeln.
Kenne mich mit C noch nicht so aus.


BYTE Zahl=255

Müsse dann in einem String den Wert "FF" haben.

Wie mache ist das?

MfG

Monika Clinton

Autor: D. W. (dave) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuch dich mal mit MOD und DIV
% 16
/ 16

Autor: jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
such mal unter "union"

da wird beides in einem Speicherbereich abgelegt und man kann es lesen
als was amn will.

Autor: Michael Kondor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <stdio.h>

int main()
{
  char str[2];
  int i=120;

  sprintf(str,"%x",i);

  printf("%s",str);

  return 0;
}

Autor: Michael Kondor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bzw.:
int i=255;

Autor: RAM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das geht in die sprichwörtliche Hose. Beliebter Fehler.


  char str[2]; // <<<
  int i=120;

  sprintf(str,"%x",i);


Der Puffer "str" ist nur für einstellige Zahlen, also Zahlen kleiner
als 15, ausreichend dimensioniert.

Autor: Mike Schaub (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht hilft das weiter.

Gruß
Mike

Autor: Monika Clinton (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich glaube ich verwende die Routine von Mike.
Mal herzlichen Dank für die Hilfe.

Aber ich habe noch eine andere Frage.


unsigned char BufferUart[10];
char *stringtext;

BufferUart[0] = 'C';
BufferUart[1] = 'A';
BufferUart[2] = '1';

stringtext = BufferUart[0] + BufferUart[1]  + BufferUart[2]

in stringtext sollte dann "CA1" stehen.

Wie kann ich Zeichen im Buffer in den String laden?

habe noch nicht so viel Ahnung.


Gruss
Monika Clinton

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> in stringtext sollte dann "CA1" stehen.

Nein.

> Wie kann ich Zeichen im Buffer in den String laden?

Erstmal mußt du dich von dem Glauben lösen, char* sei in irgendeiner
Weise ein Stringtyp. char* ist ein Zeiger auf einen char, und sonst
nichts. Die Zeile

   stringtext = BufferUart[0] + BufferUart[1]  + BufferUart[2]

wird die drei Werte addieren. Bei ASCII hat 'C' den Wert 67, 'A'
hat den Wert 65 und '1' den Wert 49. Es kommt also 181 heraus. Das
wird dann als Adresse interpretiert. stringtext zeigt also nachher auf
die Speicherstelle mit der Adresse 181.
Um einen String zu bauen, mußt du erstmal Speicher dafür haben. Du
könntest es etwa so machen:
char stringtext[4]; // Platz für 3 Zeichen + Stringterminierung
sprintf(stringtext, "%c%c%c", BufferUart[0],
        BufferUart[1], BufferUart[2]);

Oder so:
char stringtext[4]; // Platz für 3 Zeichen + Stringterminierung
stringtext[0] = BufferUart[0];
stringtext[1] = BufferUart[1];
stringtext[2] = BufferUart[2];
stringtext[3] = '\0';

Letztere Variante könnte man natürlich auch mit einer Schleife machen.

Autor: Monika Clinton (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Rolf

Ich verstehe die Sache nur Teilweise. Vielleicht habe ich es falsch
formuliert.


unsigned char BufferUart[10];
BufferUart[0]

Im BufferUart sind in BufferUart[4] bis BufferUart[7] in jedem Zeichen
ein Hexwert also 0-F. Also von 0000 -FFFF

Ich will also dies Wert in einen String laden ihn einer Routine
übergeben die den Hexwert in einen Integer umwandelt.

unsigned int hex4atoi(const char * s);

MfG

Monika Clinton

Autor: Monika Clinton (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:

"BufferUart[0]" habe ich verstehentlich hier reingeschrieben.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Im BufferUart sind in BufferUart[4] bis BufferUart[7] in jedem
> Zeichen ein Hexwert also 0-F. Also von 0000 -FFFF

Als Zeichen oder direkt als binärer Wert? Steht also in BufferUart[4]
z.B. das ASCII-Zeichen 'A' drin oder steht dort der Wert 10 (= hex
A)?

Autor: Monika Clinton (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beispiel:

BufferUart[4] = 65;   Für ein 'A'
BufferUart[5] = 70;   Für ein 'F'
BufferUart[6] = 66;   Für ein 'B'
BufferUart[7] = 66;   Für ein 'B'

Für AFBB

Autor: Monika Clinton (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe das Problem gelöst. Danke für eure Hilfe.

unsigned char BufferUart[10];
unsigned char Value[4];
int Dezwert;

Routine unsigned int hex4atoi(const char * s);


BufferUart[4] = 65;   Für ein 'A'
BufferUart[5] = 70;   Für ein 'F'
BufferUart[6] = 66;   Für ein 'B'
BufferUart[7] = 66;   Für ein 'B'

Value[0] = BufferUart[4];
Value[1] = BufferUart[5];
Value[2] = BufferUart[6];
Value[3] = BufferUart[7];


Dezwert = hex4atoi(Value);

Autor: xXx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich muß ganz ehrlich sagen, dass der Beitrag von Michael Kondor sehr gut
ist. Klar sollte man aufpassen, dass der String für die Zeichen groß
genug ist. So sollte der String für Zahlen von 0 bis 65535 5 Zeichen
lang  sein. 4 Hex Ziffern 0-F und die 0x00 für das String Ende.

Autor: Tobias Paul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wäre es denn mit:
itoa (int zahl, char *string, int radix );

Info:
http://www.goblack.de/desy/sc12chip/c/bibliothek/itoa.html

Autor: Michael Kondor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist eine einfache Antwort auf eine einfache Frage.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>

Ich habe das Problem gelöst. Danke für eure Hilfe.

unsigned char BufferUart[10];
unsigned char Value[4];
int Dezwert;

Routine unsigned int hex4atoi(const char * s);


BufferUart[4] = 65;   Für ein 'A'
BufferUart[5] = 70;   Für ein 'F'
BufferUart[6] = 66;   Für ein 'B'
BufferUart[7] = 66;   Für ein 'B'

Value[0] = BufferUart[4];
Value[1] = BufferUart[5];
Value[2] = BufferUart[6];
Value[3] = BufferUart[7];


Dezwert = hex4atoi(Value);


<<


Nun, das geht aber weißgott auch einfacher. Wie schon gesagt, gibt es
keine Stringvariablen oder sowas in C. Das gibt es einfach nicht.
Strings werden als Array interpretiert, das aus mehreren Chars besteht.
Der Name dieses Arrays (Hier zB Value) zeigt auf das erste Zeichen des
Strings im Speicher.

Du kannst also genauso gut schreiben

unsigned char BufferUart[10];
unsigned char Value[4];
unsigned int Dezwert;

unsigned int hex4atoi(const char * s);


BufferUart[4] = 65;   Für ein 'A'
BufferUart[5] = 70;   Für ein 'F'
BufferUart[6] = 66;   Für ein 'B'
BufferUart[7] = 66;   Für ein 'B'

Dezwert = hex4atoi(BufferUart);


Ich gebe zu, das ist nicht ganz leicht zu erklären mit den Pointern,
erst recht nicht, wenn man nicht versteht, was es damit auf sich hat,
und warum es die in C gibt und sonst nirgndwo. (Bzw nicht so
offensichtlich)..

Da wirst du dir mal ein Fachbuch zu C Programmierung durchlesen müssen.

Autor: Monika Clinton (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein dickes Fachbuch habe ich.

Nur ist dies nicht von heute auf Morgen durchgelesen und schon gar
nicht verstanden.

Ich habe mal vor mehrer Jahren etwa Jahr C++ Builder programmiert. Aber
wenn man es nicht ständig benutzt und andere Programmiersprachen
verwendet dann geht beim mir dies schnell verloren.

Für mich ist C eine schwer verständliche Progammiersprache. Obwohl ich
es noch nicht gut behersche, kann ich doch viele Ideen schon umsetzen.

Autor: Tobias Paul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum macht ihr das so kompliziert ?
Oder funktioniert die Funktion itoa bei diesem, von meiner Sicht ganz
simplen Problem nicht.

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.