这段代码应该将字符串转换为二进制字符串,但是有几个字符串,它会返回一个带有16个二进制数字的String
,而不是我预期的8位。
public class aaa {
public static void main(String argv[]){
String nux="ª";
String nux2="Ø";
String nux3="(";
byte []bites = nux.getBytes();
byte []bites2 = nux2.getBytes();
byte []bites3 = nux3.getBytes();
System.out.println(AsciiToBinary(nux));
System.out.println(AsciiToBinary(nux2));
System.out.println(AsciiToBinary(nux3));
System.out.println("number of bytes :"+bites.length);
System.out.println("number of bytes :"+bites2.length);
System.out.println("number of bytes :"+bites3.length);
}
public static String AsciiToBinary(String asciiString){
byte[] bytes = asciiString.getBytes();
StringBuilder binary = new StringBuilder();
for (byte b : bytes)
{
int val = b;
for (int i = 0; i < 8; i++)
{
binary.append((val & 128) == 0 ? 0 : 1);
val <<= 1;
}
binary.append(' ');
}
return binary.toString();
}
}
在前两个字符串中,我不明白为什么它们返回2个字节,因为它们是单字符字符串。
此处编辑为:https://ideone.com/AbxBZ9
返回:
11000010 10101010
11000011 10011000
00101000
number of bytes :2
number of bytes :2
number of bytes :1
我正在使用此代码:Convert A String (like testing123) To Binary In Java
NetBeans IDE 8.1
答案 0 :(得分:6)
字符长度不总是1个字节。想一想 - 许多语言,如中文或日文,都有数千个字符,你会如何将这些字符映射到字节?
您正在使用UTF-8(将字符映射到字节的众多方法之一) - 查找UTF-8的字符表,并搜索序列11000010 10101010
,我到达
U+00AA ª 11000010 10101010
ª
的UTF-8编码。 UTF-8通常是Java的默认字符编码(charset) - 但你不能依赖它。这就是为什么在转换specify a charset或strings to bytes
答案 1 :(得分:-1)
通过运行这个简单的代码,你可以理解为什么某些字符是两个字节
// integer - binary
System.out.println(Byte.MIN_VALUE);
// -128 - 0b11111111111111111111111110000000
System.out.println(Byte.MAX_VALUE);
// 127 - 0b1111111
System.out.println((int) Character.MIN_VALUE);
// 0 - 0b0
System.out.println((int) Character.MAX_VALUE);
// 65535 - 0b1111111111111111
如您所见,我们只需 Byte.MAX_VALUE
或7 bits
1 byte (01111111)
如果您将Character.MIN_VALUE
转换为整数,则为:0
我们可以使用 one bit
或1 byte (00000000)
来展示它的二进制格式!
但是Character.MAX_VALUE
呢?
以二进制格式表示
1111111111111111
<十进制格式 65535
,可以 2 bytes (11111111 11111111)
显示。
所以十进制格式在0 and 65535
之间的字符可以用 1 or 2 bytes
显示。