我从套接字中获取了一个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如何包含此值???
谢谢
答案 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不会对整数参数范围进行任何验证。