/ / Mettre un court en 2 octets de chaîne - java, chaîne, actionscript-3, octet, court

Mettre un court en 2 octets de chaîne - java, chaîne, actionscript-3, octet, court

Je fais donc mon propre protocole de mise en réseau pour unjeu en ligne, pour économiser de l'espace, chaque message (envoyé via TCP) reçoit un ID court, 2 octets, tous les messages envoyés du serveur au client et vice versa sont des chaînes, comment puis-je convertir un court en chaîne en java en seulement 2 octets (caractères)?

Mettre à jour: Je ne suis probablement pas clair sur ce que je veux ... Je veux pouvoir convertir un court int en 2 caractères, afin que je puisse envoyer le court sur le réseau dans un format de chaîne en seulement 2 octets et le décoder de nouveau en un court de l'autre côté (dans actionscript 3).

Un personnage peut contenir 256 valeurs possibles, n'est-ce pas? Donc 256 * 256 = 65 536 qui est la taille d'un short int non signé!

Voici ce que j’ai eu jusqu’à présent:

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
}

Cela peut transformer un int en un seul caractère qui peut être envoyé sur le réseau, maintenant j'ai juste besoin qu'il utilise 2 caractères et il peut faire jusqu'à un court.

Réponses:

5 pour la réponse № 1

Il est possible de le faire pour une valeur de "possible".

String s = "" + (char)myShort;

toutefois, la chaîne résultante peut être invalide car tous les entiers 16 bits ne représentent pas des points de code valides (encodés en UTF-16)! Autrement dit, la chaîne résultante peut être un invalide Séquence UTF-16. Diverses fonctions de chaîne et / ou encodage / décodage peuvent entraîner "comportement étrange" car les règles fondamentales ont été violées (je pense qu'il est quelque peu laxiste quelle peut se produire, mais ...). Vous avez été averti - voir l'exemple du bas montrant une seule manifestation possible.

tl, dr. N'utilisez pas de chaînes pour ce type de transmission réseau *. Plutôt, utiliser des tableaux d'octets (ou ByteBuffers) et envoyer le court comme deux octets, haut et bas. (Oh, et ai-je mentionné ByteBuffers? Jetez un œil aux méthodes ...) Si des chaînes doivent être envoyées, elles peuvent être encodées (utf-8) et également envoyées sous forme d '"octets" dans les paquets de données.

Bien sûr, il est probablement plus simple d’utiliser Sérialisation standard ou Tampons de protocole pour gérer les paquets ... bat bien sûr l'encodage personnalisé. (De plus, les tampons de protocole font quelques astuces comme le codage entier en zig-zag ...)

Bonne codage :)


* Bien que Quake 3 utilise des chaînes pour un certain nombre de messages réseau ... cependant, il a codé les valeurs "en texte brut" - par exemple "xyz = 1234" - et utilisé un tas de code de sérialisation à la main de singe.


Voir la dernière valeur dans la sortie pour savoir pourquoi ce "bourrage de chaîne" peut être mauvaises choses ;-)

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);
}
}

Les résultats dans 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 pour la réponse № 2

DataOutputStream.writeShort / DataInputStream.readShort?


-1 pour la réponse № 3

Je n'utilise pas Java, mais je pense que vous voulez justeutilisez un opérateur de cast. Si votre court est appelé mynumber, utilisez (char) mynumber. Autrement dit, si vous avez l'intention de traiter ces bits comme un court lorsqu'ils sortent de l'autre côté. Bonne chance avec la multiplicité des plates-formes, mais si vous utilisez "court" comme définition de votre champ plutôt que "16 bits signé int", il existe des plates-formes ésotériques.