2011-06-03 120 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); 
    } 
} 
相關問題