gpt4 book ai didi

java - 将 short 放入 2 个字节的字符串中

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:53:57 25 4
gpt4 key购买 nike

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

更新:我可能不清楚我想要什么......我希望能够将一个 short int 转换为 2 个字符,这样我就可以仅以 2 个字节的字符串格式通过网络发送 short,并在另一侧(在 actionscript 3 中)将其解码回 short。

一个字符可以容纳 256 个可能的值,对吧?所以 256*256=65,536 这是一个 unsigned short int 的大小!

这是我到目前为止所得到的:

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 个字符,它最多可以做一个 short。

最佳答案

对于“可能”的某些值,这是可能的。

String s = "" + (char)myShort;

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

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

当然,使用 standard Serialization 很可能更简单或 Protocol buffers处理数据包...肯定胜过自定义编码。 (另外,protocol buffers 做了一些巧妙的技巧,比如之字形整数编码……)

快乐编码:)


*尽管 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!!!!!

关于java - 将 short 放入 2 个字节的字符串中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7925116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com