浅谈java.io包中数据转换类Bits

有人说,若想看看完美优雅的继承和装饰,就需要看看io包,今天偶然间看到了一个并没有向外提供功能的io工具类Bits,简单分享下学习心得,有错误之处还望道友指出,谢谢

package com.gg;


/**
 * 解析io包中的Bits这个类,可以看出这个类并没有被public修饰,所以只适合同包中的类相互访问,仅仅作为同包中做数据流转、切换
 * 此例子来源于java1.8(代码是拷出来的)
 */
class Bits {



    //首先分析第一个方法,仅仅用于获取byte数组中off坐标下是否存在不为0的数据,因为boolean类型只占1位,即1bit
    static boolean getBoolean(byte[] b, int off) {
        return b[off] != 0;
    }

    /**
     * 第二个方法,获取byte数组中连续的两个内存地址数据,我们知道计算机底层存储数据是以二进制存储的,一位等于1bit,其中1byte=8bit,
     * 而1char=2byte,并且在类型声确定之初就已经获取了固定的内存长度,所以需要获取两个连续byte的内存才满足占位16的char类型,我们知道
     * 0xFF是以16进制表示的数据,其计算机存储底层数据为11111111,假如此时获取的byte[off]底层数据为00000001,byte[off+1]底层数据为00110011
     * 计算机为32位,64位数据长一些就用32位
     * 进行运算获取低八位数据:
     * 00000000 00000000 00000000 00110011
     * 00000000 00000000 00000000 11111111
     * -----------------------------------      &
     * 00000000 00000000 00000000 00110011
     * 高八位数据为:
     * 00000000 00000000 00000000 00000001
     * ----------------------------------   <<8
     * 00000000 00000000 00000001 00000000
     * 第三步:
     * 00000000 00000000 00000000 00110011
     * 00000000 00000000 00000001 00000000
     * ------------------------------------    +
     * 00000000 00000000 00000001 00110011
     * 最后转换为char类型截取后16位后为00000001 00110011,输出为ij
     * 其中0xff是为了保证非有效位为0,防止负数时自动补1
     */
    static char getChar(byte[] b, int off) {
        return (char) ((b[off + 1] & 0xFF) +
                (b[off] << 8));
    }

    //同上
    static short getShort(byte[] b, int off) {
        return (short) ((b[off + 1] & 0xFF) +
                (b[off] << 8));
    }

    //原理同上,只是位数变为32位
    static int getInt(byte[] b, int off) {
        return ((b[off + 3] & 0xFF)      ) +
                ((b[off + 2] & 0xFF) <<  8) +
                ((b[off + 1] & 0xFF) << 16) +
                ((b[off    ]       ) << 24);
    }

    //同上,只是再调用intBitsToFloat把int转换为float
    static float getFloat(byte[] b, int off) {
        return Float.intBitsToFloat(getInt(b, off));
    }

    //同上,位数变为64位
    static long getLong(byte[] b, int off) {
        return ((b[off + 7] & 0xFFL)      ) +
                ((b[off + 6] & 0xFFL) <<  8) +
                ((b[off + 5] & 0xFFL) << 16) +
                ((b[off + 4] & 0xFFL) << 24) +
                ((b[off + 3] & 0xFFL) << 32) +
                ((b[off + 2] & 0xFFL) << 40) +
                ((b[off + 1] & 0xFFL) << 48) +
                (((long) b[off])      << 56);
    }

    //同上,再调用longBitsToDouble转换为double
    static double getDouble(byte[] b, int off) {
        return Double.longBitsToDouble(getLong(b, off));
    }

    //把数据置于内存byte数组中,boolean占1bit
    static void putBoolean(byte[] b, int off, boolean val) {
        b[off] = (byte) (val ? 1 : 0);
    }

    /**
     * 把char类型置于连续内存的byte数组中,假定传入的char类型的val=a,其计算机底层存储二进制位00000000 01100001
     *  第一步将val转换为byte类型,截取低八位为:01100001存储在byte[off+1]
     *  第二步将val不带符号右移8位:
     *  00000000 00000000 00000000 01100001
     *  ------------------    >>>8
     *  00000000 00000000 00000000 00000000
     *  然后强转,将00000000 00000000 00000000 00000000 截取为00000000,存储在byte[off]
     *
     */
    static void putChar(byte[] b, int off, char val) {
        b[off + 1] = (byte) (val      );
        b[off    ] = (byte) (val >>> 8);
    }
    //同上
    static void putShort(byte[] b, int off, short val) {
        b[off + 1] = (byte) (val      );
        b[off    ] = (byte) (val >>> 8);
    }
    //同上
    static void putInt(byte[] b, int off, int val) {
        b[off + 3] = (byte) (val       );
        b[off + 2] = (byte) (val >>>  8);
        b[off + 1] = (byte) (val >>> 16);
        b[off    ] = (byte) (val >>> 24);
    }
    //同上
    static void putFloat(byte[] b, int off, float val) {
        putInt(b, off,  Float.floatToIntBits(val));
    }
    //同上
    static void putLong(byte[] b, int off, long val) {
        b[off + 7] = (byte) (val       );
        b[off + 6] = (byte) (val >>>  8);
        b[off + 5] = (byte) (val >>> 16);
        b[off + 4] = (byte) (val >>> 24);
        b[off + 3] = (byte) (val >>> 32);
        b[off + 2] = (byte) (val >>> 40);
        b[off + 1] = (byte) (val >>> 48);
        b[off    ] = (byte) (val >>> 56);
    }
    //同上
    static void putDouble(byte[] b, int off, double val) {
        putLong(b, off, Double.doubleToLongBits(val));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值