hex wert einzelne bytes ermitteln

Gast #4149867
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.
Gast #4149885
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.
Gast #4149894
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;
  }
}
Gast #4149904
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 ...
#4149917
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.