对于我的LZW压缩代码。我选择将代码存储为9位代码,字典的大小为512,因此将只有256个新的空间
符号。现在,我觉得我没有为工作选择合适的缓冲区:
byte[] buffer = new byte[3];
此缓冲区更适合存储12位,9位的等效值是多少,如何将9位正确存储在缓冲区中?
我用它在buffer [0]中存储8位,在buffer [1]中存储4位。 9位的等效值是多少?
buffer[0] = (byte) (code & 255);
buffer[1] = (byte) ((code >> 8) << 4);
最佳答案
九是很难工作的。第一个问题是:您能用8位工作吗?
假设没有,我将考虑在字典级别分配和打包9位字,而不关注字节边界。 512字节字典= 4096位= 455个9位符号。您只需要一些数学运算就可以从位流中访问这些符号:
byte[] buffer = new byte[512];
function getWord(int wordOfs) {
// Gets wordOfs'th 9-bit symbol from buffer, For buffer of 512 bytes, wordOfs = 0 -> 454
if (wordOfs<0 || wordOfs>454) throw InvalidArgumentException;
int bitsOfs = wordOfs * 9; // Offset (in bits) of the desired 9 bit word
int idx = bitsOfs / 8; // buffer[idx] contains bit 0 of the desired word
int ofs = bitsOfs % 8; // ... shifted this many places to the right
// Grab at least 8 bits beyond the calculated starting point
unsigned word val = buffer[idx] | (buffer[idx+1]>>8);
// Shift and mask it down to the desired 9 bits for return
return (val << ofs) & 0x01FF;
}
警告:我现在无法访问Java编译器,语法可能需要工作。