Java IO类库之Bits

package java.io;

/**
 * Utility methods for packing/unpacking primitive values in/out of byte arrays
 * using big-endian byte ordering.
 */
class Bits

一、Bits的简介   

    通过阅读jdk注释我们可以了解到这个类提供了各种方法用于把基础数据类型转化存储到字节数组中,或者从字节数组中解析出对应的基础数据类型,字节数组的排序方式采用的是高位编址。

    什么是高位编址呢,简单理解就是高序字节存储在字节数组的起始位置,也就是与低位编址方式相反,它是在地址低位存储值高位。看类的权限修饰符可知这个类应该是作为一个工具类在所在包中使用。

二、Bits的数据结构

成员方法主要包括两部分,一部分是基于byte数组和下标提取基础数据类型,方法包括:

static boolean getBoolean(byte[] b, int off);

static char getChar(byte[] b int off);

static short getShort(byte[] b, int off);

static int getInt(byte[] b,int off);

static long getLong(byte[] b, int off);

static  float getFloat(byte[] b, int off);

static double getDouble(byte[] b, int off);

另一部分主要是把基础数据类型转化存储到byte数组,方法与上述方法一一对应包括:

static voidputBoolean(byte[] b, int off,boolean val);

static voidputChar(byte[] b int off, char val);

static void putShort(byte[] b, int off, short val);

static void putInt(byte[] b,int off, int val);

static void putLong(byte[] b, int off, long val);

static  void putFloat(byte[] b, int off, float val);

static void putDouble(byte[] b, int off, double val);

三、源码分析

    因为方法列表的内部逻辑大体相似,我们就选取getInt和putInt两个方法进行分析,而不对全部方法进行依次讲解了,大家可以照着思路结合源码去分析。

static void putInt(byte[] b,int off, int val):

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);
}

putInt方法逻辑很简单,int有四个字节,按照高位编址顺序,通过右移位运算,依次把值从最高位到最低位存储到byte数组中

static int getInt(byte[] b,int off):

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);
}

与putInt逻辑相反,从byte数组中提取int值需要从起始下标off开始,扫描数组中off下标以及之后3个byte值,按照高位编址顺序,低位存储值高位,通过位与和左移位运算获取高位到低位保存的值并累加,最终返回byte数组中保存的int值。

 

转载于:https://my.oschina.net/zhangyq1991/blog/1853732

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值