我正在研究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