Hi,
da ich eine Minecraft UDF schreibe und es leid bin die Empfangenden Daten über große Umwege in ein lesbares Format umzuwandeln, hab ich mir gedacht, dass man das ganze viel bequemer in C++ realisieren kann.
Eine Netzwerkverbindng herzustellen war erstmal kein Problem, aber als ich versuchte die benötigten Logindaten zu senden kam ich schon ins Grübeln.
Die ersten Handshake Packete zum MC Server sehen so aus:
0x02<Länge des Strings><String (UCS-2 string, big-endian)>
Im Moment löse ich das so:
Spoiler anzeigen
SocketData = String16(Username);
SocketData = static_cast<char>(2) + SocketData;
string String16(string Text)
{
int StringLen,x,first=0,second=0;
string output = "";
StringLen = Text.length();
//eine umständliche variante um die länge des Strings in den String zu bekommen
if (StringLen < 255) {
first = StringLen;
} else {
first = 255;
second = StringLen - 255;
}
output += static_cast<char>(second);
output += static_cast<char>(first);
for (x=0; x<=StringLen; x++)
{
output.append<int>(1,0x0);
output.append(Text.substr(x,1));
}
return output;
}
Alles anzeigen
der Zugehörige AutoIt Code sieht so aus:
Spoiler anzeigen
TCPSend($iSocket, "0x02" & String16($sUsername))
Func String16($sString)
Local $bData
$bData = StringTrimLeft(StringToBinary($sString, 3), 2)
$bData = Hex(BinaryLen("0x" & $bData) / 2, 4) & $bData
Return $bData
EndFunc ;==>String16
Ein Fertig zusammengesetztes Login Packet sähe dann so aus:
0x0200040054006500730074
PacketID
Länge des Strings (Ohne Null Bytes vom String)
String (Test)
[color=#000000]Nun zu meiner Frage, wie kann ich das Eleganter Lösen und gibt es eine Variante von WinSock2 die STD Strings als Parameter annimmt?
Wer es vieleicht bei seiner Lösung benötigt: Hier sind die Datentypen vom Minecraft Protokoll