2017-02-22 210 views
-3

所以我有一個數以千計的1和0的字符串,我想以二進制文件的形式保存到文件中(因此文件大小很小)。不幸的是,我不知道如何在沒有運行NumberFormatExceptions的情況下做到這一點。將1和0的字符串轉換爲二進制文件

我試過Byte.parseByte,但似乎沒有工作。任何幫助將不勝感激。

try { 
     File file = new File(BINARY_FILE); 
     DataOutputStream dso = new DataOutputStream(new FileOutputStream(file)); 
     for (int j = 0; j < bits.length(); j += 8) { 
      Byte b = Byte.parseByte(bits.substring(j, j + 8)); 
      dso.write(b); 
     } 
    } catch (IOException e) { 
     System.out.println("Error"); 
    } 
+0

顯示你已經試過的代碼 –

+0

增加,位變量是1和0的字符串。 – BananaPineapple

+0

另外,我們保證字符串的長度可以被8整除嗎? –

回答

2

如果您只想寫入字節,請不要用DataOutputStream打包。

您也應該使用try-with-resources完成後關閉文件流。

解析8位時,需要指定基數2,否則就是解析基數爲10的數字,而不是二進制。

解析是針對帶符號的數字的,因此,由於您使用的是8位無符號字節,因此應該解析爲int而不是byte

您不應該使用valueOf(),而是使用parseInt()。不需要獲得裝箱對象。

所以,你的代碼應該是:

try { 
    File file = new File(BINARY_FILE); 
    try (FileOutputStream out = new FileOutputStream(file)) { 
     for (int j = 0; j < bits.length(); j += 8) { 
      int b = Integer.parseInt(bits.substring(j, j + 8), 2); 
      out.write(b); 
     } 
    } 
} catch (IOException e) { 
    System.out.println("Error"); 
} 

parseByte(s, 2)是一個有符號解析,所以它onlu支持"-10000000"(-128 )和"01111111"(127 )之間的值。任何以1開頭的8位二進制數將會失敗java.lang.NumberFormatException: Value out of range. Value:"11111111" Radix:2

+0

雖然僅僅是因爲符號,但在8位字節的情況下使用32位整數似乎有點低效。 –

+0

@DM ['write()'](https://docs.oracle.com/javase/8/docs/api/java/io/FileOutputStream.html#write-int-)以'int'作爲參數,即使它只使用低8位,無論你是解析爲「byte」,「short」還是「int」,它都會被轉換爲「int」。無法解析字節而沒有錯誤,所以不妨將其解析爲'int',因爲這是方法所需的。 – Andreas

+0

這看起來很有效,但如果有更好的東西,它會繼續嘗試和改進。 – BananaPineapple

1

我想解決一個尚未解決的問題:如何處理奇數位。

您不能將單個位寫入文件,只能寫入字節。文件大小始終爲全字節,即使Java可以處理文件大小爲小數部分的文件,文件系統也無法處理。

爲了輸出的最後幾個數字可能會或可能不會是一個完整的8,你可以做這樣的事情:

for (int j = 0; j < bits.length(); j += 8) { 
     int b; 
     if (j + 8 < bits.length()) 
     { 
      b = Integer.parseInt(bits.substring(j, j + 8), 2); 
     } 
     else 
     { 
      b = Integer.parseInt(bits.substring(j), 2); 
     } 
     dso.write(b); 
    } 

現在你substring不會熄滅的字符串的結尾。

至於如何區分以「00001111」結尾的字符串與以「1111」結尾的字符串(它們具有相同的字節值)之間的區別,也許您可​​以在文件的開頭寫入一個字節值bits.length % 8。這會讓你知道如何處理最後一個字節。例如,如果它是6,那麼你知道1111確實是「001111」而不是「1111」。如果它是4,那麼它確實是「1111」。

相關問題