我想通过将字符串放入字节数组(String.getBytes[]
)将String转换为二进制,然后将每个字节(Integer.toBinaryString(bytearray)
)的二进制字符串存储在String []中。然后我想通过Byte.parseByte(stringarray[i], 2)
转换回普通字符串。这适用于标准ASCII表,但不适用于扩展的表。例如,A
给了我1000001
,但Ä
返回
11111111111111111111111111000011
11111111111111111111111110000100
任何想法如何管理?
public class BinString {
public static void main(String args[]) {
String s = "ä";
System.out.println(binToString(stringToBin(s)));
}
public static String[] stringToBin(String s) {
System.out.println("Converting: " + s);
byte[] b = s.getBytes();
String[] sa = new String[s.getBytes().length];
for (int i = 0; i < b.length; i++) {
sa[i] = Integer.toBinaryString(b[i] & 0xFF);
}
return sa;
}
public static String binToString(String[] strar) {
byte[] bar = new byte[strar.length];
for (int i = 0; i < strar.length; i++) {
bar[i] = Byte.parseByte(strar[i], 2);
System.out.println(Byte.parseByte(strar[i], 2));
}
String s = new String(bar);
return s;
}
}
答案 0 :(得分:8)
首先:“扩展ASCII”是一个非常具有误导性的标题,用于指代大量不同的编码。
第二:Java中的byte
被签名,而编码中的字节通常被处理为无符号。由于您使用Integer.toBinaryString()
,byte
将使用符号扩展名转换为int
(因为字节值&gt; 127将由Java中的负值表示)。
为了避免这种情况,只需使用& 0xFF
来屏蔽除了低8位以外的所有内容,如下所示:
String binary = Integer.toBinaryString(byteArray[i] & 0xFF);
答案 1 :(得分:1)
要扩展Joachim's point关于“扩展ASCII”,我会添加...
请注意,getBytes()
是一种转码操作,可将数据从UTF-16转换为平台默认编码。编码因系统而异,有时甚至在同一台PC上的用户之间。这意味着结果在所有平台上都不一致,如果遗留编码是默认的(就像在Windows上一样)数据可能会丢失。
要使操作对称,您需要provide an encoding explicitly(最好是Unicode编码,如UTF-8或UTF-16。)
Charset encoding = Charset.forName("UTF-16");
byte[] b = s1.getBytes(encoding);
String s2 = new String(b, encoding);
assert s1.equals(s2);