将一个短字放入2个字节的字符串中

Jam*_*s T 3 java string byte short actionscript-3

因此,我正在为在线游戏制作自己的网络协议,为了节省空间,每条消息(通过TCP发送)都被赋予一个短的2字节ID,从服务器发送到客户端的所有消息,反之亦然是字符串,如何只用2个字节(字符)将java中的short转换为字符串?

更新:我可能不清楚我想要什么...我希望能够将一个短的int转换为2个字符,这样我就可以通过网络以短字节格式发送短消息,只需2个字节.将其解码回另一侧的短片(在动作3中).

一个角色可以容纳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
}
Run Code Online (Sandbox Code Playgroud)

这可以将一个int变成一个可以通过网络发送的单个字符,现在我只需要让它使用2个字符就可以做到最短.

小智 6

这可以用于"可能"的某些值.

String s = "" + (char)myShort;
Run Code Online (Sandbox Code Playgroud)

但是,结果字符串可能无效,因为并非所有16位整数都表示有效(UTF-16编码)的代码点!也就是说,结果字符串可能是无效的 UTF-16序列.各种字符串函数和/或编码/解码可能会导致"奇怪的行为",因为违反了基本规则(我认为它可能会发生什么,但是......).您已收到警告 - 请参阅底部示例,其中仅显示一种可能的表现形式.

TL,博士.不要使用字符串进行这种网络传输*.相反,使用字节数组(或ByteBuffers)并将short发送为两个八位字节,高和低.(哦,我提到了ByteBuffers吗?看看方法......)如果需要发送字符串,它们可以编码(UTF-8)并在数据包中作为"字节"发送.

当然,使用标准的序列化协议缓冲区来处理数据包很可能更简单......确实胜过自定义编码.(另外,协议缓冲区做了一些巧妙的技巧,比如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);
    }
}
Run Code Online (Sandbox Code Playgroud)

结果在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!!!!!
Run Code Online (Sandbox Code Playgroud)