将char表示为Java中的一个字节

时间:2009-03-30 22:37:58

标签: java arrays char byte

我必须将char转换为字节或字节数组。在其他语言中,我知道char只是一个字节。但是,查看Java Character类,其最小值为\ u0000,其最大值为\ uFFFF。这使得它看起来像一个2字节长的字符。

我能将它存储为字节还是需要将其存储为两个字节?

在有人要求之前,我会说我正在尝试这样做,因为我在一个接口上工作,希望我的结果是一个字节数组。所以我必须将我的char转换成一个。

请让我知道并帮助我理解这一点。

谢谢, JBU

4 个答案:

答案 0 :(得分:35)

要将字符转换为字节,您需要指定character encoding。某些字符编码每个字符使用一个字节,而其他字符编码使用两个或更多字节。实际上,对于许多语言来说,使用单个字节编码的字符太多了。

在Java中,从字符转换为字节的最简单方法是使用String类的getBytes(Charset)方法。 (StandardCharsets类定义了一些常见的编码。)但是,如果无法在指定的编码下映射字符,此方法将使用sile静默替换字符。如果您需要更多控制,可以配置CharsetEncoder以处理此情况并显示错误或使用其他替换字符。

答案 1 :(得分:8)

一个char在Java中确实是16位(并且也是唯一的无符号类型!!)。

如果您确定字符的编码是ASCII,那么您可以将它们转换为一个字节(因为ASCII仅使用字符的低7位)。

如果您不需要修改字符或理解字符串中的含义,您只需将字符存储在两个字节上,例如:

char[] c = ...;
byte[] b = new byte[c.length*2];
for(int i=0; i<c.length; i++) {
    b[2*i] = (byte) (c[i]&0xFF00)>>8; 
    b[2*i+1] = (byte) (c[i]&0x00FF); 
}

(如果速度很重要,最好用右移替换2 *。)

但请注意,一些实际(显示)字符(或更准确地说,Unicode代码点)写在两个连续的字符上。因此,在两个字符之间切换并不能确保您在实际字符之间切换。

如果需要以字符串感知方式解码/编码或以其他方式操作char数组,则应该尝试使用java.io工具对char数组或String进行解码和编码,以确保正确的字符操作。 / p>

答案 2 :(得分:4)

要扩展其他人所说的内容,如果你有一个字符数组所需的字符,那么首先创建一个包含该字符串的字符串,然后从字符串中获取字节数组:

private byte[] charToBytes(final char x) {
  String temp = new String(new char[] {x});
  try {
    return temp.getBytes("ISO-8859-1");
  } catch (UnsupportedEncodingException e) {
    // Log a complaint
    return null;
  }
}

当然,请使用适当的字符集。更有效的是,开始使用Strings而不是一次获取一个char,转换为String,然后转换为字节数组。

答案 3 :(得分:0)

java中的char是无符号的16位值。如果你拥有的东西将适合7位,那么只需将强制转换为一个字节(例如ASCII就适合)。

您也可以查看java.nio.charset API。