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值。