我必须将 char 转换为字节或字节数组。在其他语言中,我知道 char 只是一个字节。但是,查看 Java Character 类,它的最小值是 \u0000,最大值是 \uFFFF。这使得 char 看起来像 2 个字节长。
我可以将其存储为一个字节还是需要将其存储为两个字节?
在有人问之前,我会说我正在尝试这样做,因为我正在一个接口下工作,该接口期望我的结果是一个字节数组。所以我必须将我的 char 转换为一个。
请让我知道并帮助我理解这一点。
谢谢,jbu
要将字符转换为字节,您需要指定字符编码。一些字符编码每个字符使用一个字节,而另一些则使用两个或更多字节。事实上,对于许多语言来说,用一个字节编码的字符太多了。
在 Java 中,将字符转换为字节的最简单方法是使用String
类的getBytes(Charset)
方法。(StandardCharsets
该类定义了一些常见的编码。)但是,如果字符无法在指定的编码下映射,则此方法将默默地用 � 替换字符。如果您需要更多控制,您可以配置 aCharsetEncoder
以处理这种错误情况或使用不同的替换字符。
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 进行解码和编码,以确保正确的字符操作。
为了扩展其他人的说法,如果您有一个需要作为字节数组的字符,那么您首先创建一个包含该字符的字符串,然后从字符串中获取字节数组:
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;
}
}
当然,使用适当的字符集。这将是开始使用字符串而不是一次获取一个字符,转换为字符串,然后转换为字节数组,效率更高。
java中的char是一个无符号的16位值。如果您拥有的内容适合 7 位,那么只需转换为一个字节(例如 ASCII 适合)。
您也可以签出java.nio.charset API。