代码之家  ›  专栏  ›  技术社区  ›  Matthieu Napoli

Java字符包含值>255?

  •  2
  • Matthieu Napoli  · 技术社区  · 15 年前

    我从套接字得到一个字符数组:

    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 价值远不止

    谢谢你

    6 回复  |  直到 15 年前
        1
  •  8
  •   Michael Petrotta user3140870    15 年前

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

    看起来您正在尝试将RGB值存储在 char[3] . 我可以推荐一个 byte[3] ,或 java.awt.Color

    Color c = new Color(255, 255, 240);
    
        2
  •  7
  •   Adrian Pronk    15 年前

    read(char[], int, int) 上的方法 InputStream Reader 子类(如 InputStreamReader ). 使用平台默认字符编码自动将字节转换为字符,在您的情况下,它看起来像 windows-1252

    您收到的字符,8224是Unicode字符 U+2020 Dagger '†'

    如果您正在读取一个包含非文本内容的文件,则需要确保您没有使用 读卡器 但是使用 输入流 相反。或者,您可以使用 输入流阅读器 并指定一个字符编码,如 ISO-8859-1 将每个字节映射到具有相同数值的字符。

        3
  •  5
  •   linuxuser27    15 年前

    char type in Java 是16位。

    byte .

        4
  •  2
  •   Grodriguez    15 年前

    InputStream 而不是一个 Reader .

    我还想指出一些与你的问题没有直接关系的问题:打电话的时候 InputStream.read(byte[]) InputStream.read(byte[], int, int) 要读取多个字节,不要假设所有请求的字节在返回时都已读取。呼叫 read 字节可用。您应该始终检查返回值以找出实际读取了多少字节。

    这同样适用于 中的方法 .

        5
  •  1
  •   Édgar Sánchez Gordón    15 年前

    Java使用UTF(不是ASCII)来存储字符,UTF的长度是16位,所以它可以包含高达65.535的值。

        6
  •  0
  •   Antimony    13 年前

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

    推荐文章