7-bit 压缩法,针对Integer数据的一种压缩算法,可以将4个字节的Int型数据压缩为1~5个字节,数值越小,压缩后的字节数越少,所以对值小的Int型数据会有比较好的压缩效果,其具体压缩原理,算法如下:
压缩后的结果如下:
- 将一个Int型数据转换成32位;
- 0~6位,按原值写入;
- 如果原值的第7位及以后存在1,则转换后的byte的最高位写入1,否则写入0,结束写入(即压缩为了1个字节) ;
- 如果没结束,则写入原值的第7~13位,如果原值的第14位及以后存在1,则转换后byte的最高位写入1,否则写入0,结束写入 ;
- 重复上述行为,直到写完为止 。
下面的代码就是一个7-bit压缩算法的实现:
private final static int VALUE_MASK = 0x7f;
private final static int NEXT_BIT_SHIFT = 7;
private final static int NEXT_BIT_MASK = 1 << 7;
public static int putCompressedInt(OutputStream out,final int value) throws IOException {
int i = 0;
int tmpValue = value;
do {
byte b = (byte) (tmpValue & VALUE_MASK);
tmpValue >>>= NEXT_BIT_SHIFT;
if (tmpValue != 0) {
b |= (byte) NEXT_BIT_MASK;
}
out.write(b);
i++;
} while (tmpValue != 0);
return i;
}
public static void main(String[] args) {
try {
FileOutputStream out = new FileOutputStream("/export/compressedInt.txt");
putCompressedInt(out,125);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
压缩后的结果如下:
因为写入文件的是byte值,125对应的值为‘}’。
如果压缩值为268435457,对应的二进制数为1,0000,0000,0000,0000,0000,0000,0001。按照压缩算法,压缩后的值如下:
此时,7-bit压缩算法将一个4个字节的整数压缩为了5个字节。接下来分析以下这个过程。
268435457对应的二进制为1,0000,0000,0000,0000,0000,0000,0001。
1)取0~6位,为000001。因为原值的第7位以后存在1,所以第一个byte最高位写入1,第一个byte值为1000,0001。即-127;
2)取7~13位,均为0。因为原值的第15位之后存在1,所以第二个byte最高位写入1,第二个byte值为1000,0000。即-128.;
3)取14~20位,和第二步相同,第三个byte值为1000,0000。即-128;
4)取21~27位,同上一步,第四个byte值为1000,0000。即-128;
5)取28~31位,因为上面再没有其他值,所以第5个byte最高位为0,而原值只有第28位有值且为1。所以,第5个byte值为0000,0001。即1。
转载请注明出处:http://blog.csdn.net/iAm333
7-bit整数压缩算法及实例分析
本文介绍了7-bit整数压缩算法,将Int型数据转换为32位表示,并通过示例详细解释了如何压缩一个4字节整数为5字节的过程,包括取位、判断和编码规则。
1196

被折叠的 条评论
为什么被折叠?



