Wie wandelt ich Dez in Hex um?

Gast #367445
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.
Gast #367447
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
Gast #367448
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.
Gast #367449
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
Gast #367451
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)?
Gast #367453
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);
Gast #367454
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.
Persönliche Seite #367457
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.
Gast #367458
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren