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

时间:2011-10-28 04:20:40

标签: java string actionscript-3 byte short

所以我正在为在线游戏制作自己的网络协议,为了节省空间,每条消息(通过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个字符就可以做到最短。

3 个答案:

答案 0 :(得分:6)

这可以用于“可能”的某些值。

String s = "" + (char)myShort;

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

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

当然,使用standard SerializationProtocol 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”,那么跨平台会好运,那里有一些深奥的平台。