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.
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....
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.
Ich dachte eingentlich nur an eine mathematische Lösung nicht an ein C-Programm. Nein die Werte stehe auf meinem Zettel auf dem Tisch.:)
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.
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
Gerade die letzte Lösung mit dem shiften ist die mathematische lösung
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? ... ;)
Was ist ein Int-Wert? Ich glaube, wir benötigen wohl noch die Bitbreite und die Endiness deines Zettels. :P
:
Bearbeitet durch User
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
Woraus ergibt sich denn die Bitbreit. 1 Bit ist doch ein Bit also eine Informationseinheit, oder doch nicht? ?=)|-<
keystone schrieb: > 0x10 0x30 0x25 0x60. > > Diese 4 hex Werte möchte ich gerne als einen Integerwert zusammenfassen. Das möchte ich machen:)
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.
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.
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"...
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?
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?
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.
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
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
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.
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.)
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.