7-bit整数(Integer)压缩算法

7-bit 压缩法,针对Integer数据的一种压缩算法,可以将4个字节的Int型数据压缩为1~5个字节,数值越小,压缩后的字节数越少,所以对值小的Int型数据会有比较好的压缩效果,其具体压缩原理,算法如下:
  1. 将一个Int型数据转换成32位; 
  2. 0~6位,按原值写入;
  3. 如果原值的第7位及以后存在1,则转换后的byte的最高位写入1,否则写入0,结束写入(即压缩为了1个字节) ;
  4. 如果没结束,则写入原值的第7~13位,如果原值的第14位及以后存在1,则转换后byte的最高位写入1,否则写入0,结束写入 ;
  5. 重复上述行为,直到写完为止 。

下面的代码就是一个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();
        }
    }

压缩后的结果如下:

7-bit整数(Integer)压缩算法_第1张图片

因为写入文件的是byte值,125对应的值为‘}’。

如果压缩值为268435457,对应的二进制数为1,0000,0000,0000,0000,0000,0000,0001。按照压缩算法,压缩后的值如下:

7-bit整数(Integer)压缩算法_第2张图片
此时,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整数(Integer)压缩算法)