Java BitSet写入文件

时间:2013-03-22 16:22:42

标签: java bitset huffman-code

我正在研究霍夫曼压缩算法。我有每个角色的代码。例如     F = 1100
    d = 111
    E = 1101
    B = 101
    C = 100
    A = 0

现在为了实现压缩,我需要将代码作为位写入二进制文件。我现在能够将它们写成字节,除了增加压缩文件的大小之外什么都不做。如何将代码作为位写入Java中的二进制文件?

1 个答案:

答案 0 :(得分:1)

如果您有“fdebcafdbca”文本,那么您需要编写它 比特:

110011111011011000110011111011011000

分开并填充:

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

        }
    }

}