字符串到二进制,反之亦然:扩展ASCII

我想通过将String放入一个字节数组( String.getBytes[] )将String转换为二进制,然后将每个字节的二进制字符串( Integer.toBinaryString(bytearray) )存储在String []中。 然后我想通过Byte.parseByte(stringarray[i], 2)转换回普通的String。 这适用于标准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; } } 

首先:“扩展ASCII”是一个非常具有误导性的标题,用于指代大量不同的编码。

第二:Java中的byte是有符号的,而编码中的字节通常被处理为无符号。 由于使用Integer.toBinaryString()因此byte将使用符号扩展名转换为int (因为字节值> 127将由Java中的负值表示)。

为了避免这种情况,只需使用& 0xFF来掩盖除了低8位以外的所有内容,如下所示:

 String binary = Integer.toBinaryString(byteArray[i] & 0xFF); 

为了扩展Joachim关于“扩展ASCII” 的观点我会添加……

请注意, getBytes()是一种转码操作,可将数据从UTF-16转换为平台默认编码。 编码因系统而异,有时甚至在同一台PC上的用户之间。 这意味着结果在所有平台上都不一致,并且如果遗留编码是默认的(就像在Windows上一样)数据可能会丢失。

要使操作对称,您需要显式提供编码 (最好是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);