moeglicherweise zu simpel - aber ich komme nicht drauf
-
gegeben:
unsigned char buffer [100]
unsigned short st1 = 0x1234;
unsigned short st2 = 0x5678;frage, wie schaffe ich es, dass folgendes herauskommt ?
buffer[0] = 0x12;
buffer[1] = 0x34;
buffer[2] = 0x56;
buffer[3] = 0x78;habe folgendes probiert, aber das geht nicht:
(unsigned short) buffer[0] = st1;
(unsigned short) buffer[sizeof(unsigned short)] = st2;ich komme einfach nicht drauf.......
-
Portabel wird es wohl nur so gehen:
buffer[0] = st1 / 0x100; buffer[1] = st1 % 0x100; buffer[2] = st2 / 0x100; buffer[3] = st2 % 0x100;
Dir schwebte vielleicht so etwas vor:
*((unsigned short*)&buffer[0]) = st1; //...
Das geht aber nur, wenn die verwendete Architektur Big Endian ist.
-
Naja, man koennte sich ja ne kleine Funktion bauen, welche prueft es sich um
eine Big Endian-Architektur handelt oder nicht und dann entsprechend rechnet.Um das zu ueberpruefen, kannst du folgenden Code verwenden:
//es handelt sich nur um den relervanten codeausschnitt //aus dem Buch "Programmieren von Unix-Netzwerken" union { short s; char c[sizeof(short)]; } un; un.s = 0x0102; if(sizeof(short) == 2) { if(un.c[0] == 1 && un.c[1] == 2) //big-endian else if(un.c[0] == 2 && un.c[1] == 1) //little-endian else //es gibt auch architekturen, welche //anders vorgehen ;) } else //sizeof(short) != 2
mfg
v R
-
Hi,
als ich das gelesen hab, hab ich zuerst gedacht, das man das doch mit einer union, lösen könnte oder nicht, also ca. so (hab es jetzt nicht getestet)union TEST { unsigend int Zahl; char Zeichen[2] }; //und nun irgendwo im Programm TEST Test; Test.Zahl = 0x1234; cout << Test.Zeichen[0]; //0x12
Jetzt meine Frage, würd das nciht auch gehen, oder bin ich völlig auf den Holzpfad?
Mfg
Viets
-
Viets schrieb:
Jetzt meine Frage, würd das nciht auch gehen, oder bin ich völlig auf den Holzpfad?
Auch das ist von Litte/Big Endian abhängig. Dein Programm gibt bei mir 4 aus - das Zeichen mit dem Code 0x34.
-
Ahja, danke für die Aufklärung.
Anmerkung: Mein Gott bin ich blind virtuell Realisticer hat das doch schon mit der Union gepostet, nur hab ich das wohl übersehen *andieStirnklatsch*
Mfg
Viets
-
erstmal danke fuer die antworten.
in der tat habe/hatte ich 2 probleme:
1.) die short int in den buffer zu bekommen (da war mein typecast falsch).
2.) little/big endian da der buffer uebers netzwerk an verschiedene zielsystem geschickt wird, wo die byteorder unterschiedlich sein kann.
habe deswegen auch mit htons und ntohs experimentiert.mein letzter stand: ich definiere selbst in welchem format ich die daten in den buffer lege und schreibe sie dann passend zurueck. wenn es nicht klappt werde wohl nochmal fragen muessen
-
Hallo,
du brauchst dir eigentlich keine Sorgen machen, denn TCP uebertraegt immer im
Big Endian-Anordnung (Quelle: Linux/Unix-Systemprogrammierung, S. 857)mfg
v R
-
virtuell Realisticer schrieb:
du brauchst dir eigentlich keine Sorgen machen, denn TCP uebertraegt immer im
Big Endian-Anordnung (Quelle: Linux/Unix-Systemprogrammierung, S. 857):-U TCP kümmert sich aber nicht darum, wie du die Daten reintust, wenn du sowas machst
int abc=0x12345678; send(s, (char *)abc, sizeof(abc));
dann ist das TCP ziemlich egal, weil der nur Byteströme bekommt. Wie die INternen Felder von TCP/IP ausgelegt sind, hilft hier jedenfalls nicht.