我正在研究Huffman压缩算法。我有每个角色的代码。例如 F = 1100
d = 111
E = 1101
B = 101
C = 100
α= 0
Java BitSets写入文件
现在,为了实现压缩我需要编写代码为位到一个二进制文件。我现在可以将它们写成字节,它除了增加压缩文件的大小外什么都不做。如何在Java中将代码编写为二进制文件的位?
我正在研究Huffman压缩算法。我有每个角色的代码。例如 F = 1100
d = 111
E = 1101
B = 101
C = 100
α= 0
Java BitSets写入文件
现在,为了实现压缩我需要编写代码为位到一个二进制文件。我现在可以将它们写成字节,它除了增加压缩文件的大小外什么都不做。如何在Java中将代码编写为二进制文件的位?
那么如果你有文字 “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
}
}
}
这不是Java具体。文件有字节,而不是java。 – kan 2013-03-22 16:24:50
@kan:我在问Java中的Bitsets – Maverick 2013-03-22 16:25:46
Bitset是一组位。但是你有一些位。 – kan 2013-03-22 16:27:14