C String (binär) in eine 32bit Integer Variable casten
-
theta schrieb:
Die representation des 32 bit Wertes ist unterschiedlich, je nach System (Big- bzw. Little Endian). Um zu konvertieren kannst Du die Funktionen ntohl(..) bzw. htonl(..) benutzen (winsock2.h und ws2_32.lib).
wieso gehst du davon aus, dass er ein Windows Programmier ist?
@gabyx: wenn ich richtig verstanden hab, dann willst du 'a' (==0x61) im niederwertigsten Byte haben ... und 'd' (==0x64) im höherwertigsten Byte haben, oder? Du kannst, wie von theta vorgeschlagen, memcpy verwenden, allerdings musst du dann auf byte-order achten.
"abcd" ist in hex Form doch = 0x61626364 oder irre ich mich da?
nicht zwangsläufig, es könnte auch 0x64636261 sein, je nachdem wie *du* die Bytes anordnen willst.
Das end Zeichen '\0' ist ja auch noch dabei...
nein, {'a', 'b', 'c', 'd', 0 } ist 40 bit breit und passt nicht in 32-bits
-
supertux schrieb:
wieso gehst du davon aus, dass er ein Windows Programmier ist?
Gehe ich nicht. Aber falls er/sie sein Code unter Windows kompiliert und linkt ist das oben genannte eine mögliche Lösung die Byte Order zu ändern.
Wenn er/sie eine andere Platform benutzt, wird er/sie sicher rasch bei Google fündig.
Simon
-
Auch sowas hier wäre möglich:
i = *(str); i += *(str+1) << 8; i += *(str+2) << 16; i += *(str+3) << 24; printf("0x%x: 0x%x 0x%x 0x%x 0x%x\n", i, i >> 24 & 0xFF, i >> 16 & 0xFF, i >> 8 & 0xFF, i & 0xFF);
EDIT auch das hier (gerade probiert)
i = *(int *)(str);
-
supertux schrieb:
nein, {'a', 'b', 'c', 'd', 0 } ist 40 bit breit und passt nicht in 32-bits
Wer sagt denn das er die Null mitkopieren will?
-
Die antworten waren sehr hilfreich!!
super das mit memcopy wusste ich nicht ,es geht schluss endlich um ein aufsplitten von Serial Com daten auf Windows, habe aber zuerst mit Linux gecoded, muss das noch portieren,
und zum richtigen zuweisen der message zu den enthaltenen messdaten muss ich da ein paar chars umwandeln ...Besten Dank!!
-
NDEBUG schrieb:
EDIT auch das hier (gerade probiert)
i = *(int *)(str);
Das Funktioniert SUPER! Vielleicht muss man noch Unsigned int nehmen oder so..
aberchar * string="abcd"; // char string[]={'a','b','c','d','\0'}; funktioniert auch! int i=*(int *) string printf("%i",i);
gibt genau 1684234849, was auch 0x64636261 gibt also wurden die reihenfolge d,c,b,a geschrieben, wie kann ich es nun umdrehen? einfach den string kehren
oder MEMCOPY verwenden ?
LESE MICH NOCH IND DIE BIG ENDIAN geschichte rein mit dem umwandeln!!!
DANKE FÜR DIE SUPER INFOS!!
-
Umdrehen geht entweder wie oben beschrieben oder als Funktion so:
int LongSwap(int l) { byte b1, b2, b3, b4; // byte ist unsigned char b1 = l & 0xFF; b2 = (l>>8) & 0xFF; b3 = (l>>16) & 0xFF; b4 = (l>>24) & 0xFF; return((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4; }
-
ja, erst kehren, dann wanderln -> funzt!
-
MERCI
Funzt guut!
Danke!!
-
gabyx schrieb:
wie kann ich es nun umdrehen? einfach den string kehren
oder MEMCOPY verwenden ?
LESE MICH NOCH IND DIE BIG ENDIAN geschichte rein mit dem umwandeln!!!
DANKE FÜR DIE SUPER INFOS!!strtoul
-
union reinterpret { char bytes[4]; int value; };
Nun kannst du dir ne Funktion basteln, die die einzelnen Bytes mit welchen Buchstaben auch immer fuellt und dann einfach value benutzen. Das ist zumindestens typsicherer als i = *(int *)(str).