所以我正在为在线游戏制作自己的网络协议,为了节省空间,每条消息(通过TCP发送)都被赋予一个ID,这是一个短的2字节,从服务器发送到客户端的所有消息和副反之亦然是字符串,我怎样才能将短字转换为java中的字符串,只需2个字节(字符)?
更新:我可能不清楚我想要什么...... 我希望能够将一个短的int转换成2个字符,这样我就可以用2字节的字符串格式通过网络发送短片,然后将其解码回另一侧的短片(在actionscript 3中)。 / p>
一个角色可以容纳256个可能值吗?所以256 * 256 = 65,536,这是无符号短整数的大小!
这是我到目前为止所得到的:
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
}
这可以将一个int变成一个可以通过网络发送的单个字符,现在我只需要让它使用2个字符就可以做到最短。
答案 0 :(得分:6)
这可以用于“可能”的某些值。
String s = "" + (char)myShort;
但是,结果字符串可能无效,因为并非所有16位整数都代表有效(UTF-16编码)代码点!也就是说,结果字符串可能是无效 UTF-16序列。各种字符串函数和/或编码/解码可能导致“奇怪的行为”,因为违反了基本规则(我认为可能会发生什么有些松懈,但...)。您已被警告 - 请参阅底部示例,仅显示一种可能的表现形式。
TL,博士。 不要使用字符串进行此类网络传输* 。相反,使用字节数组(或ByteBuffers)并将短路发送为两个八位字节,高和低。 (哦,我提到了ByteBuffers吗?看看方法......)如果需要发送字符串,它们可以编码(UTF-8)并在数据包中作为“字节”发送。
当然,使用standard Serialization或Protocol buffers来处理数据包很可能更简单......确实胜过自定义编码。 (另外,协议缓冲区做了一些巧妙的技巧,比如zig-zag整数编码......)
快乐编码:)
*虽然,Quake 3使用字符串表示许多网络消息......然而,它将值编码为“纯文本” - 例如“xyz = 1234” - 并使用了一堆猴子手动序列化代码。
查看输出中的最后一个值,了解为什么这个“字符串填充”可能是坏东西; - )
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);
}
}
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 :(得分:1)
DataOutputStream.writeShort / DataInputStream.readShort?
答案 2 :(得分:-1)
我不使用java,但我认为你只想使用一个强制转换运算符。如果你的短名为mynumber,请使用(char)mynumber。也就是说,如果你打算将这些位作为一个短路处理,当它们从另一侧出来时。如果您使用“short”作为字段的定义而不是“16位signed int”,那么跨平台会好运,那里有一些深奥的平台。