使用扩展的ASCII范围将int转换为char并返回

时间:2014-08-03 09:38:55

标签: java

我正在开发一个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;
}

1 个答案:

答案 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如果你想发送一个随机生成的游戏集的描述,例如:我的世界或一套牌,你可以发送种子。从种子中,您可以重新创建相同的洗牌组。