我正在开发一个Java客户端服务器游戏。想象一下,我有一张洗牌的卡片,有70张卡片,每张卡片都有固定ID(0-69);
当这个爪子被洗牌时,我有一个包含ID的int数组(下面的例子只包含几个可能的数字)。
现在我认为将这个爪子“编码”为字符串并通过DataOutputStream将其发送给客户端是一个好主意。
我想这样做的方法是将int转换为char,但我使用扩展的ASCII范围(> 127)。当我测试这个时,我得到的字符都是ISO8859-1,到目前为止都很好。但最近我想我读到你不能完全确定每个JVM在> 127范围内的行为都是一样的。
我现在的问题是:当我回到int时,我必须做100%确定Java客户端将得到完全相同的数字?有可能吗?
感谢。
// Server side
int[] numbers = new int[] { 5, 47, 31, 30, 20, 58, 11, 5, 19 };
String s = "";
for (int i = 0; i < numbers.length; i++) {
s += (char) (numbers[i] + 150);
}
//Client side
int[] decoded = new int[s.length()];
for (int i = 0; i < s.length(); i++) {
decoded[i] = ((int) s.charAt(i)) - 150;
}
答案 0 :(得分:1)
您可以确定ISO-8859-1在每个平台上都是相同的。如果你想使用ISO-8859-1
,将数字转换为chaacters然后使用编码将其转换回数字(字节)没有多大意义。您也可以使用端到端的字节。
byte[] numbers = { 5, 47, 31, 30, 20, 58, 11, 5, 19 };
OutputStream out = ...
out.write(numbers.length);
out.write(numbers);
DataInputStream in =
byte[] bytes = new byte[in.read()];
in.readFully(bytes);
或者您可以使用文字。
PrintWriter pw = ...
pw.print(numbers.length);
for(byte b: numbers) {
pw.print(" ");
pw.print(b);
}
pw.println();
Scanner in = ...
byte[] b = new byte[in.nextInt()];
for(int i = 0; i < b.length; i++)
b[i] = in.nextInt();
如果您想发送数字,只需发送数字而不是文字。如果您想要文本,请将它们作为文本发送。不要混合二进制和文本数据,因为这通常会导致混淆。
我没有看到任何值为数字添加150的值,您仍然会遇到同样的问题。
BTW如果你想发送一个随机生成的游戏集的描述,例如:我的世界或一套牌,你可以发送种子。从种子中,您可以重新创建相同的洗牌组。