Forum: Mikrocontroller und Digitale Elektronik 4Byte Wert als Dezimalzahl ausgeben


von keystone (Gast)


Lesenswert?

In einem Ip-Protokoll werden die Nutzdaten in Hex ausgelesen.


Ich möchte die Daten nun als Dezimalzahl ausgeben.

Die Dezimalzahl besteht aus 4Byte also

0x10 0x30 0x25 0x60.

Diese 4 hex Werte möchte ich gerne als 1 Dezimalzahl zusammenfassen.

von Testi (Gast)


Lesenswert?

Und?

von keystone (Gast)


Lesenswert?

wie fasse ich die 4Werte zusammen?

von Testi (Gast)


Lesenswert?

Stehen die in nem Array??

Dann einfach:

int32_t * NEW_PTR = (int32_t) &OLDArray[0];

Dann kannste mit int32_t a = NEW_PTR[0];
z.B..

Oder aber du fängst an die je nach Endian zu shiften...


int32_t a = OLDArray[0] + ((int32_t) OLDArray[1]<< 8) +   ((int32_t) 
OLDArray[2]<< 16) +  ((int32_t) OLDArray[3]<< 24) ;

Oder aber du nutzt memcpy...

Oder über snprintf in str wandeln...
oder....

von Testi (Gast)


Lesenswert?

Sufu hier im Forum bzw google ist dein Freund...

von Daniel A. (daniel-a)


Lesenswert?

Testi schrieb:

> int32_t * NEW_PTR = (int32_t) &OLDArray[0];

Es muss (int32_t*) sein, und nicht (int32_t)

> Dann kannste mit int32_t a = NEW_PTR[0];
> z.B..

Ich musste früh lernen, soetwas nie zu tun. Die endian des Systems, für 
welches das Programm kompiliert wurde, beeinflusst das Resultat. 
Ausserdem kann man da gleich int32_t a = *(int32_t*)OLDArray; schreiben. 
Eigentlich müsste man es vorher noch zu void* casten, sonst darf der 
compiler das wegoptimieren.

> Oder aber du fängst an die je nach Endian zu shiften...
>
> int32_t a = OLDArray[0] + ((int32_t) OLDArray[1]<< 8) +   ((int32_t)
> OLDArray[2]<< 16) +  ((int32_t) OLDArray[3]<< 24) ;

Das ist Perfekt. Shiftoperationen sind unabhängig vom verwendeten endian 
des Systems, das wird immer funktionieren.

von keystone (Gast)


Lesenswert?

Ich dachte eingentlich nur an eine mathematische Lösung nicht an ein 
C-Programm.


Nein die Werte stehe auf meinem Zettel auf dem Tisch.:)

von easy (Gast)


Lesenswert?

keystone schrieb:
> Ich dachte eingentlich nur an eine mathematische Lösung nicht an
> ein C-Programm.
>
> Nein die Werte stehe auf meinem Zettel auf dem Tisch.:)

Dann nimmt du den Windoofs Taschenrechner und wandelte die hex nach 
binär. Die Einsen und Nullen tippst du wieder in den Rechner und 
wandelte nach dezimal.

von Max H. (hartl192)


Lesenswert?

keystone schrieb:
> Ich dachte eingentlich nur an eine mathematische Lösung nicht an ein
> C-Programm.

0x10 0x30 0x25 0x60 =

  1 * 16^7
+ 0 * 16^6
+ 3 * 16^5
+ 0 * 16^4
+ 2 * 16^3
+ 5 * 16^2
+ 6 * 16^1
+ 0 * 16^0
──────────
=  271590752 dez

von Gerald G. (gerald_g)


Lesenswert?

Gerade die letzte Lösung mit dem shiften ist die mathematische lösung

von Detlef K. (adenin)


Lesenswert?

0x10 = 16
0x30 = 48
0x25 = 37
0x60 = 96

Entweder
(16 *256 + 48)*256 + 37)*256 +96 = 271590752
oder
(96 *256 + 37)*256 + 48)*256 +16 = 1613049872

Beim nächsten mal bitte angeben:
Anzahl der Beine des Tisches.
Material.
Drehtisch.
Tischdecke? Mit Blumenmuster? ...
;)

von keystone (Gast)


Lesenswert?

Ok

und wie fasse ich den 4 Byte zu einem Int-Wert zusammen?

von Detlef K. (adenin)


Lesenswert?

Was ist ein Int-Wert?

Ich glaube, wir benötigen wohl noch die Bitbreite und die Endiness 
deines Zettels. :P

: Bearbeitet durch User
von keystone (Gast)


Lesenswert?

Integerwert

von Max H. (hartl192)


Lesenswert?

keystone schrieb:
> Integerwert
Und was meinst du damit? Eine ganze Zahl die aus 32bit besteht?
Ich hoffe ich bin nicht der einigen der nicht verstanden hat was du 
vorhast. Würdest du mir/uns bitte genau erklären, was du genau vor hast?

: Bearbeitet durch User
von topsspot (Gast)


Lesenswert?

Woraus ergibt sich denn die Bitbreit. 1 Bit ist doch ein Bit also eine 
Informationseinheit, oder doch nicht?

    ?=)|-<

von topsspot (Gast)


Lesenswert?

keystone schrieb:
> 0x10 0x30 0x25 0x60.
>
> Diese 4 hex Werte möchte ich gerne als einen Integerwert zusammenfassen.

Das möchte ich machen:)

von topsspot (Gast)


Lesenswert?

Das möchte er/sie machen Ups

von Marcel (Gast)


Lesenswert?

keystone schrieb:
> und wie fasse ich den 4 Byte zu einem Int-Wert zusammen?

Die Frage wurde dir bereits zu genüge beantwortet. Du hast 4 8-bit Werte 
und möchtest einen 32-bit Wert daraus machen. Also einfach nur Bits 
verschieben. Wie? Steht hier im Thread. Zu schwer zu verstehen? Siehe 
Bitmanipulation.

von Ralph (Gast)


Lesenswert?

Testi schrieb:
> int32_t a = OLDArray[0] + ((int32_t) OLDArray[1]<< 8) +   ((int32_t)
> OLDArray[2]<< 16) +  ((int32_t) OLDArray[3]<< 24) ;

Da steht es. Ist in der 3. Antwort.

Ob das in der Darstellung HEX, DEC oder BIN vorliegt ist völlig egal.
Ist jeweils der gleiche Inhalt.

Max H. schrieb:
> 0x10 0x30 0x25 0x60 =
>
>   1 * 16^7
> + 0 * 16^6
> + 3 * 16^5
> + 0 * 16^4
> + 2 * 16^3
> + 5 * 16^2
> + 6 * 16^1
> + 0 * 16^0
> ──────────
> =  271590752 dez

Die Umrechnung der Darstellung war dann in der 5. Antwort schon 
enthalten.

von Max H. (hartl192)


Lesenswert?

Marcel schrieb:
> Die Frage wurde dir bereits zu genüge beantwortet.
Genau das verwirrt mich. Aber vllt. versteht der TO ja ganz was anderes 
unter "Integerwert"...

von keystone (Gast)


Lesenswert?

Ich bin mir nicht sicher aber bekomme ich mein Ergebnis nicht über die 
Formel

s0...s3 sind die Hexwerte umberechnet in Dec.
A=s0+s1*2^8+s3*2^26



Ich bin mir nicht sicher?

von keystone (Gast)


Lesenswert?

keystone schrieb:
> Ich bin mir nicht sicher aber bekomme ich mein Ergebnis nicht über die
> Formel
>
> s0...s3 sind die Hexwerte umberechnet in Dec.
> A=s0+s1*2^8+s3*2^16
>
> Ich bin mir nicht sicher?

von easy (Gast)


Lesenswert?

Nimm den Windoofs Rechner. Stelle ihn auf hex. Tipps die Zahlen ohne die 
vorgestellten 0x ab. Also 10302560. Dann andere die Zahlendarstellung 
auf dez und gut isses.

von Max H. (hartl192)


Lesenswert?

keystone schrieb:
> s0...s3 sind die Hexwerte umberechnet in Dec.
> A=s0+s1*2^8+s3*2^26

easy schrieb:
> Nimm den Windoofs Rechner.
*Windows

: Bearbeitet durch User
von keystone (Gast)


Lesenswert?

gibt es eine Beschreibung zu der Formal im Netz?

von Max H. (hartl192)


Lesenswert?

Kleiner Tipp: Beschäftige dich mal mit dem Hexadezimalsystem, welche 
Stelle welche Wertigkeit hat. 
https://de.wikipedia.org/wiki/Hexadezimalsystem

Überleg mal, wie würdest du 4 Dezimalzahlen aus Zwei stellen in eine 
4Stellige Dezimalzahl umrechnen?

: Bearbeitet durch User
von W.S. (Gast)


Lesenswert?

keystone schrieb:
> Ich bin mir nicht sicher aber bekomme ich mein Ergebnis nicht über die
> Formel
>
> s0...s3 sind die Hexwerte umberechnet in Dec.
> A=s0+s1*2^8+s3*2^26

Ist das jetzt hier ne Warmhalteübung, um das Forum zu füllen?
Warum kannst du nicht die einfachsten Dinge selber rechnen?
z.B.
Erg = ((A*16+B)*16+C)*16+D

W.S.

von heute unangemeldet (Gast)


Lesenswert?

W.S. schrieb:
> Erg = ((A*16+B)*16+C)*16+D

Laut Fragestellung des TO sind A,B,C,D Bytes, also 2 Hex-Stellen.
Es gilt also       Zahl = ((A*256+B)*256+C)*256+D

Aber ich glaube, das ist nicht das, was der TO wissen will,
sondern: Wie berechnet man die Dezimalziffern dieser Zahl.


Dividiere Zahl      durch Zehn   => Ergebnis1, Rest1
                                 => Rest1 = Einer

Dividiere Ergebnis1 durch Zehn   => Ergebnis2, Rest2
                                 => Rest2 = Hunderter

Dividiere Ergebnis2 durch Zehn   => Ergebnis3, Rest3
                                 => Rest3 = Tausender

und so fort.

(Vermutlich lacht der TO sich jetzt tot, weil
 jemand seine Frage ernst genommen hat.)

von heute unangemeldet (Gast)


Lesenswert?

Sollte natürlich heissen:

Rest2 = Zehner, Rest3 = Hunderter

von DirkB (Gast)


Lesenswert?

keystone schrieb:
> Ich bin mir nicht sicher aber bekomme ich mein Ergebnis nicht über die
> Formel
>
> s0...s3 sind die Hexwerte umberechnet in Dec.
> A=s0+s1*2^8+s3*2^26

Wenn du das in C machst, hat ^ nicht die Bedeutung hoch

von Simpel (Gast)


Lesenswert?

Was heißt bei dir: ...werden in hex ausgelesen?

In den einzelnen Bytes stehen duale Bitmuster des jeweiligen Wertes. Ob 
du die dann dezimal, hexadezimal oder binär darstellst ändert nix an dem 
8-Bitmuster bzw. dem Wert. Der Prozessor kennt nur duale Bitmuster.
Deine in 1-Byte-Blöcke aufgeteilte 4-Byte-Zahl ergibt durch die richtige 
Aneinenanderreihung der Bitmuster zu einem einzigen 
4-Byte-Variablenfomat die gewünschte numerische Gesamtzahl.

Wenn die Einzelbytes lückenlos in aufsteigender Reihenfolge (z.B. Array) 
im Speicherraum liegen, kann man den Zeiger einer unsigned 
4-Byte-Variable an deren Anfang (low-Byte) legen und hat somit die 
"ganze Zahl" am Stück, ohne Rechnerei und Shifterei.

Oder sprichst du etwa von BCD-codierten Zahlen (2x4bit also 2 
Dezimalstellen pro Byte))?

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.