Forum: Mikrocontroller und Digitale Elektronik hex wert einzelne bytes ermitteln


von Steven (Gast)


Lesenswert?

Hallo,
ich möchte von einem hex-wert jedes byte einzeln auflisten.
1
void dectohex(data){
2
  unsigned int i, temp;
3
  temp = data
4
  for(i=0; i<16; i++){
5
    DisplayData[16-i] = temp>>((i*4)&0x0F) + 48;
6
  }
7
}

Allerdings bekomme ich da nur kryptische Zeichen.
ich schiebe den wert immer um i*4 stellen nach rechts und hole mir dann 
mit 0x0F die letzten vier ziffer. mit +48 möchte ich den wert als ASCII 
bekommen.
ist da noch ein denkfehler drinne? (ich denke schon, sonst würde es mir 
ja richtig angezeigt werden). Aber eigentlich finde ich, dass es sinn 
macht, was ich da geschrieben habe.

von solala (Gast)


Lesenswert?

klammerfehler ...

probier mal: ((temp>>(i*4))&0x0F) + 48

von solala (Gast)


Lesenswert?

aber bedenke, 16*4 = 64
hat dein unsigned int 64 Bit ? (auf einer modernen Intel maschine evtl. 
schon, auf einen kleine avr sicher nicht ...)

von Peter II (Gast)


Lesenswert?

Steven schrieb:
> Aber eigentlich finde ich, dass es sinn
> macht, was ich da geschrieben habe.

ich nicht.

kein Datentype für data

und die Berechnung kann auch nicht stimmen.

i = 1;
tmp = 100;

temp>>((i*4)&0x0F) + 48;

temp>>((1*4)&0x0F) + 48;
temp>>(4&0x0F) + 48;
temp>>(4) + 48;
temp>>(4) + 48;
100>>4 + 48   macht nun keinen sinn.

von Peter II (Gast)


Lesenswert?

[nachtrag]

+ 48;


stimmt auch nur für 0-9 dann kommen aber noch keine Buchstaben.

von Steven (Gast)


Lesenswert?

Ja, die klammer war falsch. und auch mein int hat nur 32bit.
aber wenn ich es in unsigned long umwandel und als wert 0x40 übergebe 
gibt er mir 004p004p004p004p heraus. (Mein ziel ist 0000000000000040)
[code]
void dectohex(data){
  unsigned int i;
  unsigned long temp;
  temp = data
  for(i=0; i<16; i++){
    DisplayData[16-i] = (temp>>((i*4)&0x0F)) + 48;
  }
}

von Max H. (hartl192)


Lesenswert?

Ich bezweifle, dass der Code überhaupt kompiliert.

BTW:
Das mit der Code Formatierung geht so:
1
[c]
2
C-Code
3
[/c]

von Walter S. (avatar)


Lesenswert?

Steven schrieb:
> Ja, die klammer war falsch.

und ist immer noch falsch

von solala (Gast)


Lesenswert?

er möchte ja die hex ziffern haben!

wenn temp = 0xAB ist

möchte er bei i = 0

0x0B + 48 was 59 oder in ASCI ';' ergibt

??? ergibt wirklich kein sinn ...

bei Hex werten bis 9 funktioniert dein algorithmus, bei grössen 9 
müsstest du statt 48 55 dazuzählen um die sonderzeichen zwischen ascii 
0-9 und ascii A-F zu überbrücken ...

von Peter II (Gast)


Lesenswert?

Steven schrieb:
> Ja, die klammer war falsch.

die ist doch immer noch falsch

> (temp>>((i*4)&0x0F)) + 48;

setzte doch einfach mal werte ein und reche es aus.

von Max H. (hartl192)


Lesenswert?

Noch was, wenn du die Datentypen aus der <stdint.h> verwendest, dann 
weißt du genau wie breit deine Variablen sind:
http://www.cplusplus.com/reference/cstdint/

von Karl H. (kbuchegg)


Lesenswert?

Steven schrieb:

>     DisplayData[16-i] = (temp>>((i*4)&0x0F)) + 48;


Das hier kann sowieso schon mal nicht stimmen.
Denn ein Hex-Digit umfasst nun mal die Werte 0 bis 9 und A bis F. Die 
Character Darstellung davon ist aber in keinem COdesystem der Welt so, 
dass genau diese Zeichen hintereinander im Code liegen.
Also kann das schon mal nicht passen.

Die Antwort ist, wie so oft, im Prinzip teile und herrsche:
Schreib dir eine Funktion, die dir von EINEM Byte die beiden Character 
in eine bestimmte Position in einen String schreibt.

und dann benutzt du diese Funktion eben n mal um dir die Hex-Darstellung 
für einen Datentyp mit n Bytes generieren zu lassen.
Immer diese 'ich pack alles in eine einzige Funktion Rundumschläge. 
Öfter als einem lieb ist, schiesst man sich damit nur ins Knie.

Also. Wie sieht eine Funktion aus, die ein Hex-Digit lesbar konvertiert?
1
char DigitToASCII( unsigned char value )
2
{
3
  value &= 0x0F;    // sicherheitshalber
4
  if( value <= 9 )
5
    return value + '0';
6
7
  return value - 10 + 'A';
8
}
darauf aufbauend: wie sieht eine Funktion aus, die die beiden Character 
für 1 Byte bestimmt und in einen String schiebt?
1
void ByteToASCII( char* str, unsigned char value )
2
{
3
  *str     = DigitToASCII( value >> 4 );   // oberes Nibble
4
  *(str+1) = DigitToASCII( value );        // unteres Nibble
5
}
nachdem du einzelne Bytes konvertieren kannst, wie sieht eine Funktion 
aus, die zb einen int (16 Bit int) konvertiert
1
void IntToASCII( char* str, unsigned int value )
2
{
3
  ByteToASCII( str,     value >> 8 );   // oberes Byte
4
  ByteToASCII( str + 2, value );        // unteres Byte
5
}

war irgendwas davon schwierig?
Nein. Eines folgt aus dem anderen, wenn man nicht immer gleich mit dem 
Kopf durch die Wand will, sondern die Dinge systematisch von einfach in 
Richtung 'immer komplexer' aufbaut.

von c schüler (Gast)


Lesenswert?

;-)

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.