将一串二进制解析为文本/字符

时间:2011-06-03 02:56:31

标签: java

我可能忽视了一些愚蠢的事情,但我从来没有在代码中处理二进制文件,并且认为在加密程序中练习它是个好主意。 长话短说,我能够将字符串转换为二进制(以字符串的形式),但无法弄清楚如何反向。

现在,我有这样的事情:

public static String bytesToString(String bytes){
    int i = bytes.length()/8;
    int pos = 0;
    String result = "";
    for(int j=0; j<i; j++){
        String temp = bytes.substring(pos,pos+8);
        byte b = (byte) Integer.parseInt(temp);
        result = result + Byte.toString(b);
        pos++;
    }
    System.out.println("Result: " + result);
    return result;
}

我认为字节被解析为文字数字。我错过了什么? 编辑:为了澄清,我先前已经将一串文本解析为位并将它们写入字符串。我想将此字符串拆分为字节并将其解析为字母。需要“011010000110010101111001”并返回“嘿”。

4 个答案:

答案 0 :(得分:5)

如何使用Integer.parseInt(text, 2)?如,

public static int binaryToInt(String binary)
{
    return Integer.parseInt(binary, 2);
}

我不确定为什么你的binaryToString方法会将都返回一个字符串。

答案 1 :(得分:1)

Integer.parseInt(temp)将尝试将temp读取为数字并返回相应的int。例如,Integer.parseInt(“123”)返回123

编辑:请注意,字符或文本的二进制值取决于您使用的编码。例如,“hi”是ASCII中的0110100001101001,但它可能不是UTF-16或UTF-32。 Java将字符编码为UTF-16字符:请参阅http://download.oracle.com/javase/6/docs/api/java/lang/String.html   (因此Java字符是16位无符号整数)。

因此,您的bytesToString方法必须根据输入的编码区别对待输入。或者您可以专门为ASCII字符编写它,也可以将其重命名为asciiBytesToString

你最好看看:

答案 2 :(得分:1)

public class BinaryStringToChars {
  public static void main(String[] args) {
    String bin = "011010000110010101111001";

    StringBuilder b = new StringBuilder();
    int len = bin.length();
    int i = 0;
    while (i + 8 <= len) {
      char c = convert(bin.substring(i, i+8));
      i+=8;
      b.append(c);
    }
    System.out.println(b.toString());
  }

  private static char convert(String bs) {
    return (char)Integer.parseInt(bs, 2);
  }
}

答案 3 :(得分:0)

您需要一次前进8位数字,而不是逐位数字。否则你正在重复使用位。此外,你需要告诉Integer.parseInt()你想要使用什么基数,因为parseInt(String val)不能真正检测二进制文件(你想要Integer.parseInt(String val, int radix)。)你还需要选择一个字符编码来将字节转换为字符(它们不是一回事!)。假设ISO-8859-1没问题:

public static String bytesToString(String bytes){
    int i = bytes.length()/8;
    int pos = 0;
    String result = "";
    byte[] buffer = new byte[i];
    for(int j=0; j<i; j++){
        String temp = bytes.substring(pos,pos+8);
        buffer[j] = (byte) Integer.parseInt(temp, 2);
        pos+=8;
    }
    result = new String(buffer, "ISO-8859-1");
    System.out.println("Result: " + result);
    return result;
}