【问题标题】:String to binary and vice versa: extended ASCII字符串到二进制,反之亦然:扩展 ASCII
【发布时间】:2011-07-29 00:05:47
【问题描述】:

我想通过将字符串放入字节数组 (String.getBytes[]) 将字符串转换为二进制,然后将每个字节的二进制字符串 (Integer.toBinaryString(bytearray)) 存储在字符串 [] 中。然后我想通过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;
    }

}

【问题讨论】:

    标签: java string binary byte


    【解决方案1】:

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

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

    为避免这种情况,只需使用&amp; 0xFF 来屏蔽除低 8 位之外的所有位,如下所示:

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

    【讨论】:

    • 谢谢,但我没有得到它的工作。我认为Java不适用于无符号字节?如何将无符号字节转换回字符?
    • 我明白了,我必须使用bar[i] = (byte)Integer.parseInt(strar[i], 2);进行反向转换。非常感谢!
    【解决方案2】:

    要在 Joachim's point 上扩展“扩展 ASCII”,我会添加...

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

    要使操作对称,需要provide an encoding explicitly(最好是UTF-8或UTF-16等Unicode编码)

    Charset encoding = Charset.forName("UTF-16");
    byte[] b = s1.getBytes(encoding);
    String s2 = new String(b, encoding);
    assert s1.equals(s2);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-15
      • 2011-02-02
      • 2020-01-20
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      • 2012-03-06
      相关资源
      最近更新 更多