Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用扩展的ASCII范围将int转换为char并返回_Java - Fatal编程技术网

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

Java 使用扩展的ASCII范围将int转换为char并返回,java,Java,我目前正在开发一个Java客户机-服务器游戏。想象一下,我有一个洗牌魔爪,有70张牌,每张牌都有一个固定的ID(0-69) 当这个魔爪被洗牌时,我有一个包含ID的int数组(下面的例子只包含几个可能的数字) 现在我认为将这个talon“编码”为字符串并通过DataOutputStream发送给客户机是个好主意 我希望这样做的方式是将int转换为char,但我使用扩展的ASCII范围(>127)。当我测试这个时,我得到的字符都是ISO8859-1,到目前为止还不错。但最近我想我读到,您不能绝对肯定

我目前正在开发一个Java客户机-服务器游戏。想象一下,我有一个洗牌魔爪,有70张牌,每张牌都有一个固定的ID(0-69)

当这个魔爪被洗牌时,我有一个包含ID的int数组(下面的例子只包含几个可能的数字)

现在我认为将这个talon“编码”为字符串并通过DataOutputStream发送给客户机是个好主意

我希望这样做的方式是将int转换为char,但我使用扩展的ASCII范围(>127)。当我测试这个时,我得到的字符都是ISO8859-1,到目前为止还不错。但最近我想我读到,您不能绝对肯定在>127的范围内每个JVM的行为都是相同的

我现在的问题是:我必须做什么才能100%确保Java客户机在返回int时得到完全相同的数字?可能吗

谢谢

// 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;
}
//服务器端
int[]数字=新的int[]{5,47,31,30,20,58,11,5,19};
字符串s=“”;
for(int i=0;i
您可以确保ISO-8859-1在每个平台上都是相同的。如果要使用
ISO-8859-1
将数字转换为字符,然后使用编码将其再次转换为数字(字节),这没有多大意义。您也可以端到端地使用字节

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();    
PrintWriter pw=。。。
打印(数字、长度);
用于(字节b:数字){
印刷品(“”);
印刷品(b);
}
println();
扫描仪输入=。。。
byte[]b=新字节[in.nextInt()];
for(int i=0;i

如果你想发送号码,只需发送号码而不是文本。如果您想要文本,请将其作为数字即文本发送。不要混合使用二进制和文本数据,因为这通常会导致混淆

我没有看到任何值id向数字添加150,您仍然会遇到相同的问题


顺便说一句,如果你想发送一个随机生成的游戏集的描述,例如minecraft world或一组卡,你可以只发送种子。从种子中,您可以重新创建相同的洗牌集。

再问一个问题。你说我可以确定ISO-8859-1在每个平台上都是一样的。如果用户使用-Dfile.encoding=。。。是否可以手动设置任何字符集值,使解码效果与服务器上的不同?@N00bOverflow顾名思义,ISO-8859-1
是一个开放标准,因此它的编码是定义的,并且在所有平台上都是相同的,不仅仅是Java。由于它非常简单,即字符0到255是字节0到255,所以很难出错。使用它的唯一问题是chars>255的行为是未定义的,尽管在java上它们都被映射到
Concur,以
int
或text发送更为清晰。但要回答问题,如果您在
数据{Output,Input}Stream上发送和接收
字符串
,它将使用Java内部编码,并且保持不变。可以改变的是
字符串
字符
s和
字节
s之间的默认转换。如果您使用文件…流或套接字流等,这些处理字节。要在其上执行8859-1字符,请使用显式字符集ISO-8859-1创建
OutputStreamWriter
InputStreamReader
,或使用
String.getBytes()
指定ISO-8859-1的新字符串(…)
显式转换。