WORD zu char für WinSocktransfer
-
Hi,
ich hab folgendes vor, aber ein kleines Verständnisprob.
WIN32-Winsock-Kommunikation:Hab eine Var "WORD iOrder", diese soll in 2 Bytes den Representanten für einen Befehl speichern.
Also schnell einen DefineNetworkOrders.h geschrieben, der dem Client und dem Server vorliegen:
#define TUWASBESTIMMTES (1)
#define TUWASANDERS (2) //ETC
...Um nun den Server dazu zu veranlassen, "Etwas Bestimmtes" zu tun, weise ich nun zu:
iorder = TUWASBESTIMMTES; // also = 1;Dieses Word soll nun in die ersten beiden Bytes/Chars eines Strings "transmitBuf" kopiert werden, der den Befehlsidentifikator und die Daten zum Befehl enthält. (Die restlichen Daten liegen im String ab transmitBuf[2])
und dann das Paket zum Server per UDP sendet:
sendto(Socket, transmitBuf, iLenPacket,0,(struct sockaddr
&inetServAddr, servLen)Frage 1:
Muß ich die htons Sachen für die WORDvar zur Bitreihenfolge nur machen, wenn ich auf einen anderen Betriebssystemtyp will? (die Anwendung soll nur unter Win laufen).Frage 2:
Ein WORD sind ja 2 Bytes, oder gibt es da unter Win64 unterschiede (müßte doch eigentlich fast genormt sein, ergo WORD = 16Bit Vorzeichenlos...oder)?Frage 3:
Die Zahl 1 liegt doch in einem Word, da Vorzeichenlos, binär so abgelegt:
(0000 0000) (0001 0000) oder irre ich mich da? (Klammern umgeben die einzelnen Bytes die einzelen Teile...Highbyte & Lowbyte vertauscht, oder wird das hintere Byte mit dem vorderen vertauscht?)
Nun kann ich doch die einzelnen Bytes (ob ich sie jetzt mit htons auf Unixstandart bringe oder nicht mal dahingestellt) den Chars von transmitBuf[0] und [1] zuweisen...
...steh nur grade etwas auf dem Schlauch...
Gibts da was wie: (Pseudocode)
transmitBuf[0] = iOrder[highbyte];
transmitBuf[1] = iOrder[lowbyte];
Das brauch ich dann ja nur auf der Serverseite umgekeht zu machen und hab die Var dann ja wieder in einem WORD, das ich auf Serverseite auswerten kann?UND ZU ALLERLETZT DIE MASTERFRAGE:
HAB ICH IN DER GANZEN SACHE EINEN DENKFEHLER UND GEHT DAS GANZE EINFACHER UND MIT WENIGER PROZESSORTAKTEN?Danke im Vorraus. Falls ich mich irgendwo undeutlich oder schlichtweg nur dämlich ausgedrückt hab, sagt bescheid...ich versuch mein Bestes mich zu bessern und gelobe Besserung
Cu Paddy
-
Oder hilft da eher ne Zeigerberechnung:
PSEUDOCODE:
WORD Zahl;
BYTE byHiTeil, byLoTeil;
char Meldung[40];byHiTeil = Byte von Adresse von Zahl;
byLoTeil = Byte von Adresse von Zahl + 1byte;Meldung[0] = byHiTeil;
Meldung[1] = byLoTeil;???
-
Äh. Du kannst es einfach reinkopieren - reinterpret_cast funktioniert in dem Fall.
Also:char buffer[123]; WORD w = 5; *reinterpret_cast<WORD*>(&buffer[0]) = w; // oder halt = htons(w);Oder aber mit shiften, womit du dir das "htons" auch noch sparst:
buffer[0] = (w >> 8) & 0xFF; buffer[1] = w & 0xFF;