/ / Ein Short in 2 Bytes String setzen - Java, String, Actionscript-3, Byte, Short

Einfügen eines Kurzschlusses in 2 Bytes String - Java, String, Actionscript-3, Byte, Short

Also mache ich mein eigenes Netzwerkprotokoll für aOnline-Spiel, um Platz zu sparen, erhält jede Nachricht (über TCP gesendet) eine ID, die kurz ist, 2 Bytes. Alle vom Server an den Client gesendeten Nachrichten und umgekehrt sind Zeichenfolgen. Wie kann ich eine Kurzmeldung in eine Zeichenfolge in konvertieren? Java in nur 2 Bytes (Zeichen)?

Aktualisieren: Mir ist wahrscheinlich nicht klar, was ich will ... Ich möchte in der Lage sein, ein kurzes int in 2 Zeichen umzuwandeln, damit ich das kurz in einem Zeichenfolgenformat in nur 2 Bytes über das Netzwerk senden und es auf der anderen Seite wieder in ein kurzes dekodieren kann (in Actionscript 3).

Ein Zeichen kann 256 mögliche Werte enthalten, oder? Also 256 * 256 = 65.536, was der Größe eines vorzeichenlosen kurzen int entspricht!

Hier ist was ich bis jetzt habe:

public static String toCode(int c){

if(c <= 255 ){
return Character.toString((char)c);
}else{
return null;
}
}

public static int fromCode(String c){
return ((int)c.charAt(0));//Return the character code of the send string, 1 char only
}

Dies kann ein int in ein einzelnes Zeichen verwandeln, das über das Netzwerk gesendet werden kann. Jetzt muss es nur noch 2 Zeichen verwenden und es kann bis zu einem kurzen Zeichen reichen.

Antworten:

5 für die Antwort № 1

Dies ist für einen Wert von "möglich" möglich.

String s = "" + (char)myShort;

jedochkann die resultierende Zeichenfolge ungültig sein, da nicht alle 16-Bit-Ganzzahlen gültige (UTF-16-codierte) Codepunkte darstellen! Das heißt, die resultierende Zeichenfolge kann eine sein ungültig UTF-16-Sequenz. Verschiedene Zeichenfolgenfunktionen und / oder Codierung / Decodierung können dazu führen "seltsames Verhalten" da die Grundregeln verletzt wurden (ich denke, es ist etwas lasch in Bezug auf Was kann auftreten, aber ...). Sie wurden gewarnt - siehe das untere Beispiel, das nur eine mögliche Manifestation zeigt.

tl, dr. Verwenden Sie für diese Art der Netzwerkübertragung keine Zeichenfolgen *. Lieber, Verwenden Sie Byte-Arrays (oder ByteBuffers) und senden Sie die Short als zwei Oktette, hoch und niedrig. (Oh, und habe ich erwähnt ByteBuffer? Schauen Sie sich die Methoden an ...) Wenn Zeichenfolgen gesendet werden müssen, können sie codiert (utf-8) und auch als "Bytes" in den Datenpaketen gesendet werden.

Natürlich ist es sehr wahrscheinlich einfacher, nur zu verwenden Standard-Serialisierung oder Protokollpuffer um mit den Paketen umzugehen ... schlägt sicher die benutzerdefinierte Codierung. (Außerdem machen Protokollpuffer einige nette Tricks wie die Zick-Zack-Ganzzahlcodierung ...)

Viel Spaß beim Programmieren :)


* Obwohl Quake 3 Zeichenfolgen für eine Reihe von Netzwerknachrichten verwendet ... codierte es die Werte "als Klartext" - z. "xyz = 1234" - und verwendete eine Reihe von Affen-Hand-Serialisierungscode.


Sehen Sie sich den letzten Wert in der Ausgabe an, warum diese "String-Füllung" sein kann schlechte Dinge ;-)

public class test1 {
public static void main (String[] args) throws Exception {
int s1 = 0xd801;
short s = (short)s1;
String x = "" + (char)s;
System.out.println("orig int: " + s1);
System.out.println("orig short: " + s);
System.out.println("length of string: " + x.length());
System.out.println("value in string: " + (short)x.codePointAt(0));
int s2 = ((short)x.codePointAt(0)) & 0xffff;
System.out.println("restored value: " + s2);
byte[] xb = x.getBytes("UTF8");
System.out.println("encoded size: " + xb.length);
String x2 = new String(xb, "UTF8");
System.out.println("decode:" + x2);
System.out.println("decode length:" + x2.length());
int s3 = ((short)x2.codePointAt(0)) & 0xffff;
System.out.println("value in string:" + s3);
}
}

Die Ergebnisse in JDK 7, Windows 64.

orig int: 55297
orig short: -10239
length of string: 1
value in string: -10239
restored value: 55297
encoded size: 1
decode:?
decode length:1
value in string:63    WHAT IS THIS?!?!?! NOOOOO!!!!!

1 für die Antwort № 2

DataOutputStream.writeShort / DataInputStream.readShort?


-1 für die Antwort № 3

Ich benutze kein Java, aber ich denke du willst es einfachVerwenden Sie einen Cast-Operator. Wenn Ihre Kurzform mynumber heißt, verwenden Sie (char) mynumber. Das heißt, wenn Sie dann beabsichtigen, diese Bits als kurz zu behandeln, wenn sie auf der anderen Seite herauskommen. Viel Glück mit plattformübergreifender Verfügbarkeit. Wenn Sie jedoch "short" als Definition Ihres Feldes anstelle von "16-bit signiertes int" verwenden, gibt es einige esoterische Plattformen.