Forum: Mikrocontroller und Digitale Elektronik Hexzahlen


von Michael (Gast)


Lesenswert?

Hallo,

ich habe folgende Frage:
Ich habe eine 4Byte große Dezimalzahl z.B. unsigned long int mit dem
Wert 4283036831.
Jetzt muß ich die Zahl auf der seriellen Schnittstelle ausgeben, aber
Byteweise in Hex. Hat mir jemand ein Tip?

Also FF 49 F4 9F

Gruß Michael

von Jens (Gast)


Lesenswert?

unsigned long value=4283036831;
unsigned char hexbyte;

hexbyte = value;
Send(...);

hexbyte = ((unsigned long)value & 0x0000FF00) >> 8;
Send(...);

hexbyte = ((unsigned long)value & 0x00ff0000) >> 16;
Send(...);

hexbyte = ((unsigned long)value & 0xff000000) >> 24;
Send(...);

von Philipp Sªsse (Gast)


Lesenswert?

Jens ist doch gar kein hebräischer Name, aber Du schreibst von rechts
nach links? (-;

Also lieber umgekehrt:

send((unsigned char) (value >> 24));
send((unsigned char) (value >> 16));
send((unsigned char) (value >> 8));
send((unsigned char) (value));


(Merke: nur Intel fängt mit der niedrigsten Stelle an)

von Rolf Magnus (Gast)


Lesenswert?

> Jens ist doch gar kein hebräischer Name, aber Du schreibst von
> rechts nach links?

Tut er doch nicht. Er schreibt von links nach rechts, was aber bei
Zahlen auch im europäischen Raum eher unüblich ist.

von Michael (Gast)


Lesenswert?

Hallo Jens,

vielen Dank, werde ich gleich ausprobieren.

Gruß Michael

von Florian D. (Gast)


Lesenswert?

Was genau meinst Du mit "in Hex"? Sollen die Zahlen lesbar sein?

Wenn ja, dann vielleicht so:
char s[15];
sprintf(s, "%02X %02X %02X %02X", (in >> 24) & 0xFF, (in >> 16) &
0xFF, (in >> 8) & 0xFF, in & 0xFF);
Send(s);

Alternativ selbst schreiben (falls sprintf zu viel Speicher frisst):

char nibble(unsigned char v)
{
    return (v<=9) ? (v + '0') : (v-10+'A');
}

...
Send(nibble((val >> 28) & 0xF);
Send(nibble((val >> 24) & 0xF);
Send(nibble((val >> 20) & 0xF);
...
Send(nibble((val >> 0) & 0xF);

Vielleicht in einer Schleife.

von Michael (Gast)


Lesenswert?

bei dezimal 560731841 kommt 21 00 6c 00 raus.
sollte aber 21 6c 16 c1 sein.

wo ist da noch ein Fehler?

Gruß Michael

von Karl heinz B. (heinzi)


Lesenswert?

Irgendwo in Deinem Code.
Da wir aber nicht wissen wie Dein Code aussieht ....

von Michael (Gast)


Lesenswert?

char s[15];
sprintf(s, "%02X %02X %02X %02X", (in >> 24) & 0xFF, (in >> 16) &
0xFF, (in >> 8) & 0xFF, in & 0xFF);
Send(s);


es geht nur um die zeile mit sprintf.

von A.K. (Gast)


Lesenswert?

(int)((in >> 24) & 0xFF)

von Michael (Gast)


Lesenswert?

das wars.

vielen Dank für die Hilfe.

Gruß Michael

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.