字符串到二进制,反之亦然:扩展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);