2011-06-03 76 views
1

我可能忽略了一些愚蠢的东西,但我从来没有必要在代码中处理二进制文件,并认为在加密程序中练习它是个好主意, 。长话短说,我能够将字符串转换为二进制(以字符串的形式),但无法弄清楚如何做相反的操作。将二进制字符串解析为文本/字符

现在,我有这样的事情:

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”并返回“嘿”。

+0

能否请您发布的什么是你想达到一个例子 – 2011-06-03 03:03:48

+0

我**强烈推荐**中存储未加密的字符串作为? ''java.lang.String's和“binary”字符串(例如字符串的二进制表示形式)作为byte []'。将3个字节'01101000 01100101 01111001'存储在一个字符串中作为'“011010000110010101111001”'而不是'“嘿“'占用了**十六倍的空间(因为Java代表了str在内部作为UTF-16,意味着每个字符都存储为2个字节)。更糟糕的是,代码的**含义是混浊的(_这是一个“真实”字符串或“字节”字符串?),并且**性能会受到影响。** – 2011-06-03 03:41:53

回答

5

使用Integer.parseInt(text, 2)怎么样?如,

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

我不知道为什么你的binaryToString方法都需要返回一个字符串。

+0

因为我想返回字母。例如,二进制文件“hi”是0110100001101001。我会给这个方法0110100001101001,希望它被分成01101000 01101001,然后以“hi”的形式返回。 – Salem 2011-06-03 03:01:48

+1

在这种情况下,我强烈建议使用['String#getBytes(“UTF-8”)'](http://download.oracle.com/javase/6/docs/api/java/lang/String.html #getBytes(java.lang.String))和['new String(byteArray,“UTF-8”)'](http://download.oracle.com/javase/6/docs/api/java/lang/String .html#String%28byte%5B%5D%2C%20java.lang.String%29),而不是试图推出自己的方法。将字符串存储为字符串,将字节数组存储为字节数组。 – 2011-06-03 03:07:20

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

你最好看:

+0

仅由ASCII字符组成的字符串将通过ASCII和UTF-8进行相同编码,因为UTF-8是ASCII的超集。除此之外,这是使用UTF-8的一个很好的理由。 – 2011-06-03 03:11:18

+0

是的,但“一个字符串表示UTF-16格式的字符串”(取自javadoc) – ignis 2011-06-03 03:13:01

+0

没关系。 UTF-16是java使用的_internal_字符串表示。 – 2011-06-03 03:36:13

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; 
} 
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); 
    } 
} 
相关问题