4Byte Wert als Dezimalzahl ausgeben

Gast #3649810
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....
#3649818
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.
Gast #3650164
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.
Gast #3650516
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.
Gast #3650524
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.
Gast #3650649
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.
Gast #3650792
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.)
Gast #3651920
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))?

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