2013-03-22 41 views
0

我正在研究Huffman壓縮算法。我有每個角色的代碼。例如 F = 1100
d = 111
E = 1101
B = 101
C = 100
α= 0
Java BitSets寫入文件

現在,爲了實現壓縮我需要編寫代碼爲位到一個二進制文件。我現在可以將它們寫成字節,它除了增加壓縮文件的大小外什麼都不做。如何在Java中將代碼編寫爲二進制文件的位?

+0

這不是Java具體。文件有字節,而不是java。 – kan 2013-03-22 16:24:50

+0

@kan:我在問Java中的Bitsets – Maverick 2013-03-22 16:25:46

+0

Bitset是一組位。但是你有一些位。 – kan 2013-03-22 16:27:14

回答

1

那麼如果你有文字 「fdebcafdbca」 你需要編寫 作爲位:

分居和填充:

11001111 10110110 00110011 11101101 10000000 //4 bits of padding here 

在十六進制:

CF B6 33 ED 80 

所以你會寫將0xCF 0xB6 0x33 0xED 0x80的字節數組轉換爲文件。這是5個字節= 40位,4個位浪費了 位。文本最初需要12個字節,所以沒有太多的節省,因爲你需要存儲樹。如果不對齊字節邊界,則無法避免使用填充。

雖然在所有的不推薦,如果你有一個字符串,那麼你可以這樣做:

public class BitWriter { 

    private byte nthBit = 0; 
    private int index = 0; 
    private byte[] data; 

    public BitWriter(int nBits) { 
     this.data = new byte[(int)Math.ceil(nBits/8.0)]; 
    } 

    public void writeBit(boolean bit) { 
     if(nthBit >= 8) { 
      nthBit = 0; 

      index++; 
      if(index >= data.length) { 
       throw new IndexOutOfBoundsException(); 
      } 
     } 
     byte b = data[index]; 

     int mask = (1 << (7 - nthBit)); 

     if(bit) { 
      b = (byte)(b | mask); 
     } 
     data[index] = b; 
     nthBit++; 
    } 

    public byte[] toArray() { 
     byte[] ret = new byte[data.length]; 
     System.arraycopy(data, 0, ret, 0, data.length); 
     return ret; 
    } 

    public static void main(String... args) { 
     BitWriter bw = new BitWriter(6); 
     String strbits = "101010"; 
     for(int i = 0; i < strbits.length(); i++) { 
      bw.writeBit(strbits.charAt(i) == '1'); 
     } 

     byte[] b = bw.toArray(); 
     for(byte a : b) { 
      System.out.format("%02X", a); 
       //A8 == 10101000 

     } 
    } 

} 
+0

我想我想要做的是說如果我有一個字符串101010,我想考慮每個字符作爲一個位,並將其添加到字節數組,直到字節數組已滿。 – Maverick 2013-03-22 16:57:01

+0

@Maverick那太浪費了,每個字符都需要16位來表示1位。你永遠不需要像這樣的位的任何字符串表示。 – Esailija 2013-03-22 17:01:22

+0

@Maverick我在我的答案中有一些代碼,是你的意思 – Esailija 2013-03-22 17:24:50