2013-03-22 107 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