标签:style class c java tar a
hadoop
中对java的基本类型进行了writeable的封装,并且所有这些writeable都是继承自WritableComparable的,都是可比较的;并且,它们都有对应的get()
和 set()方法,
其中对整型(int 和
long)进行编码的时候,有固定长度格式(intWritable和LongWritable)和可变长度格式(VIntWritable 和
VLongWritable),其中VIntWritable和VLongWritable的编码规则是一样的,
所以VIntWritable的输出可以用VLongWritable读入。其实在VIntWritable的write(DataOUtput out) 与
readFields(DataInput
in)中分别调用的是WritableUtils.writeVint(out)和WritableUtils.readVint(int),
而writeVint()和readVint()方法也只是简单的调用了writeVLong和readVLong方法。通过writeVInt()写入的数据自然可以通过readVLong()来进行读人;编码规则如下:
其基本思想 主要思想是大的负数的压缩 ,先反码操作,将负数取反,负数一旦取反,前面的字节就有可能变零了。 然后没八位一组截取成
一个字节
写入
- public static void writeVLong(DataOutput stream, long i) throws IOException {
-
- if (i >= -112 && i <= 127) {
- stream.writeByte((byte)i);
- return;
- }
-
- int len = -112;
- if (i < 0) {
- i ^= -1L;
- len = -120;
- }
-
-
- long tmp = i;
- while (tmp != 0) {
- tmp = tmp >> 8;
- len--;
- }
-
-
- stream.writeByte((byte)len);
-
-
- len = (len < -120) ? -(len + 120) : -(len + 112);
-
-
-
- for (int idx = len; idx != 0; idx--) {
- int shiftbits = (idx - 1) * 8;
- long mask = 0xFFL << shiftbits;
- stream.writeByte((byte)((i & mask) >> shiftbits));
- }
- }
读取
- public static long readVLong(byte[] bytes, int start) throws IOException {
- int len = bytes[start];
- if (len >= -112) {
- return len;
- }
- boolean isNegative = (len < -120);
- len = isNegative ? -(len + 120) : -(len + 112);
- if (start+1+len>bytes.length)
- throw new IOException(
- "Not enough number of bytes for a zero-compressed integer");
- long i = 0;
- for (int idx = 0; idx < len; idx++) {
- i = i << 8;
- i = i | (bytes[start+1+idx] & 0xFF);
- }
- return (isNegative ? (i ^ -1L) : i);
- }
hadoop 中对Vlong 和 Vint的压缩方法,布布扣,bubuko.com
hadoop 中对Vlong 和 Vint的压缩方法
标签:style class c java tar a
原文地址:http://www.cnblogs.com/yuhan-TB/p/3742625.html