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


von Monika Clinton (Gast)


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

von D. W. (dave) Benutzerseite


Lesenswert?

Versuch dich mal mit MOD und DIV
% 16
/ 16

von jan (Gast)


Lesenswert?

such mal unter "union"

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

von Michael Kondor (Gast)


Lesenswert?

#include <stdio.h>

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

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

  printf("%s",str);

  return 0;
}

von Michael Kondor (Gast)


Lesenswert?

bzw.:
int i=255;

von RAM (Gast)


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.

von Mike Schaub (Gast)


Angehängte Dateien:

Lesenswert?

Vielleicht hilft das weiter.

Gruß
Mike

von Monika Clinton (Gast)


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

von Rolf Magnus (Gast)


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:
1
char stringtext[4]; // Platz für 3 Zeichen + Stringterminierung
2
sprintf(stringtext, "%c%c%c", BufferUart[0],
3
        BufferUart[1], BufferUart[2]);

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

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

von Monika Clinton (Gast)


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

von Monika Clinton (Gast)


Lesenswert?

Nachtrag:

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

von Rolf Magnus (Gast)


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)?

von Monika Clinton (Gast)


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

von Monika Clinton (Gast)


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);

von xXx (Gast)


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.

von Tobias Paul (Gast)


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

von Michael Kondor (Gast)


Lesenswert?

Das ist eine einfache Antwort auf eine einfache Frage.

von Simon K. (simon) Benutzerseite


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
1
unsigned char BufferUart[10];
2
unsigned char Value[4];
3
unsigned int Dezwert;
4
5
unsigned int hex4atoi(const char * s);
6
7
8
BufferUart[4] = 65;   Für ein 'A'
9
BufferUart[5] = 70;   Für ein 'F'
10
BufferUart[6] = 66;   Für ein 'B'
11
BufferUart[7] = 66;   Für ein 'B'
12
13
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.

von Monika Clinton (Gast)


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.

von Tobias Paul (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.