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

ano*_*001 2 java string binary byte

我想将String转换为二进制文件,将其放入一个字节数组(String.getBytes[])中,然后将每个byte(Integer.toBinaryString(bytearray))的二进制字符串存储在String []中.然后我想转换回普通的String via Byte.parseByte(stringarray[i], 2).这适用于标准ASCII表,但不适用于扩展的表.例如,一个A给了我1000001,但Ä返回

11111111111111111111111111000011
11111111111111111111111110000100
Run Code Online (Sandbox Code Playgroud)

任何想法如何管理?

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

Joa*_*uer 8

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

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

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

String binary = Integer.toBinaryString(byteArray[i] & 0xFF);
Run Code Online (Sandbox Code Playgroud)