2016-09-24 64 views
3

我正在研究一個Huffman java應用程序,我即將完成。但我有一個問題。我需要將一個類似於「101011101010」的字符串保存到文件中。當我用當前的代碼保存它時,它會將其保存爲每0或1佔用1個字節的字符。我很確定可以將每個0/1保存一次。字符串0和文件的位1作爲位

我已經嘗試了一些BitSet和Integer.valueOf的東西,但我無法讓它們工作。這是我當前的代碼:

FileOutputStream fos = new FileOutputStream("encoded.bin"); 
fos.write(encoded.getBytes()); 
fos.close(); 

其中'編碼'是一個字符串,可以像:「0101011101」。 如果我嘗試將其保存爲整數,則前導0將被刪除。

在此先感謝!

編輯:霍夫曼是一種壓縮方法,所以輸出的文件應該儘可能小。

+0

你爲什麼要把字符串轉換爲整數?當沒有前導0的字符串可以保存時,是不是可以用前導0保存字符串?你的問題到底是什麼? – Pat

+0

這是一種壓縮方法。所以一個'a'或'b'被轉換爲0110(4位而不是1個字節)。問題是我將1和0保存爲1個字節,所以沒有壓縮(現在更糟糕了)。 –

回答

2

我想我找到了我的答案。我把1和0的位集合使用下面的代碼:

BitSet bitSet = new BitSet(encoded.length()); 
int bitcounter = 0; 
for(Character c : encoded.toCharArray()) { 
    if(c.equals('1')) { 
     bitSet.set(bitcounter); 
    } 
    bitcounter++; 
} 

之後,我將它保存到使用bitSet.toByteArray() 當我想再次讀它,我將其轉換回使用BitSet.valueOf(bitSet.toByteArray())一個bitset文件。然後我通過像這樣循環訪問bitset:

String binaryString = ""; 
for(int i = 0; i <= set.length(); i++) { 
    if(set.get(i)) { 
     binaryString += "1"; 
    } else { 
     binaryString += "0"; 
    } 
} 

感謝所有幫助過我的人。

0

二進制文件僅限於以8的倍數存儲位。通過將您的比特串的長度

  • 計算的字節數組的長度:您可以通過斬波串入八位塊,將它們轉換爲使用Byte.parseByte(eightCharString, 2)字節,並將它們添加到一個字節數組來解決這個問題八
  • 分配所需長度
  • 運行一個循環,在表示8
  • 解析每個組塊的倍數的位置取子串從字符串的字節數組,並把結果存入相應的字節
  • 致電字節陣列上的
+0

「解析每個塊,並將結果放入相應的字節」,這是我卡在哪裏。我不能使用Integer.parseInt,因爲這將刪除前導0。當我嘗試Byte.parseByte(s,2)時,它不起作用,因爲它沒有簽名。 –

+0

@LuudvanKeulen你有什麼特例?順便說一句,如果解析'int'工作正常,你可以將'int'結果轉換爲'byte',並且它也可以工作。 – dasblinkenlight

+0

'java.lang.NumberFormatException:值超出範圍。價值:「11101101」基數:10'我讀到這是因爲它不接受任何高於某個值的值,所以1111111是不可能的。 –

0

試試這個。

String encoded = "0101011101"; 
FileOutputStream fos = new FileOutputStream("encoded.bin"); 
String s = encoded + "00000000".substring(encoded.length() % 8); 
for (int i = 0, len = s.length(); i < len; i += 8) 
    fos.write((byte)Integer.parseInt(s.substring(i, i + 8), 2)); 
fos.close(); 
+0

如果我沒有弄錯,這會得到BinaryString的十進制值嗎?它在我保存它的時候工作,但當我嘗試讀取它時,它將刪除所有前導零。例如:我做'Integer.parseInt(「00001111」,2)'這將返回15.當我嘗試執行'Integer.toBinaryString(15)'時,它將返回1111. –

+0

你應該像'String s =「 00000000「+ Integer.toBinaryString(15);'和'字符串解碼= s.substring(s.length() - 8);' – saka1029

相關問題