Java char包含值> 255?

时间:2010-09-22 00:08:41

标签: java char

我从套接字中获取了一个char数组:

char[] cbuf = new char[3];
inputStream.read(cbuf, 0, 3); // read 3 chars in buffer "cbuf", offset = 0

然后当我打印出来时:

System.out.println("r:"+(int)cbuf[0]+" g:"+(int)cbuf[1]+" b:"+(int)cbuf[2]);

我在某个方面得到了:

...
r:82 g:232 b:250
r:82 g:232 b:250
r:66 g:233 b:8224

8224 值大于 255 ,char如何包含此值???

谢谢

6 个答案:

答案 0 :(得分:8)

Java中的char原语,16位宽,用于容纳标准ASCII范围之外的字符,使用Unicode

您似乎正在尝试将RGB值存储在char[3]中。我可以建议byte[3]java.awt.Color吗?

Color c = new Color(255, 255, 240);

答案 1 :(得分:7)

InputStream上没有read(char[], int, int)方法。您必须在Reader子类(例如InputStreamReader)上调用它。 InputStreamReader使用平台默认字符编码自动将字节转换为字符,在您的情况下,它是windows-1252

您收到的字符,8224是Unicode字符U+2020 Dagger '†'。这可能是使用windows-1252字符编码从字节0x86(134)转换而来的。

如果您正在阅读包含非文本内容的文件,则需要确保不使用Reader的子类读取它,而是使用InputStream的子类代替。或者,您可以使用InputStreamReader并指定像ISO-8859-1这样的字符编码,它将每个字节映射到具有相同数值的字符。

答案 2 :(得分:5)

char type in Java是16位。

如果您正在寻找8位数据类型,请考虑使用byte

答案 3 :(得分:2)

正如人们已经指出的那样,你想要读取字节,而不是字符(在Java中字符是16位),并确保你实际上使用的是InputStream而不是Reader。 / p>

我还想指出一些与你的问题没有直接关系的东西:当调用InputStream.read(byte[])InputStream.read(byte[], int, int)来读取几个字节时,不要假设在返回时已经读取了所有请求的字节。只要某些字节可用,就可以恢复对read的调用。您应该始终检查返回值以找出实际已读取的字节数。

同样适用于read中的Reader方法。

答案 4 :(得分:1)

Java使用UTF(非ASCII)来存储字符,UTF长度为16位,因此它可以包含最多65.535的值。

答案 5 :(得分:0)

Chars是Java中的无符号16位整数。虽然从技术上讲,如果您从不受信任的字节码接收值,您必须准备好处理任意32位值,因为JVM不会对整数参数范围进行任何验证。