博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java IO类库之Bits
阅读量:6706 次
发布时间:2019-06-25

本文共 1874 字,大约阅读时间需要 6 分钟。

hot3.png

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

你可能感兴趣的文章
android APN cmnet切换cmwap
查看>>
Xcode环境变量列表
查看>>
openlava-4.0 安装教程(VMware/centos7)
查看>>
fineui实时监控(增、删、改)+CDC+长连接(一)
查看>>
mysql5.7的半同步复制
查看>>
Apache HttpClient (理解Http Client)
查看>>
Alibaba Sentinel 源码阅读(Part 2 LeapArray)
查看>>
Spring(三)装配Bean:手动装配Bean
查看>>
eclipse 调试时出现!MESSAGE Could not find bundle: or...
查看>>
ERROR Found the synthetic property @routerTransition
查看>>
js如何只获得Element自定义属性(自己手写在标签上的规定属性),不是自定义属性$(obj).attr("xx")...
查看>>
jquery support
查看>>
申奥动画长片名单出炉,动画质量大PK
查看>>
试图界定scala
查看>>
搞软件的一直会被人叫去修电脑 哎~ 发个安装方法会的可以自己装。
查看>>
Java并发编程实战
查看>>
Android App整体架构设计的思考
查看>>
2.NIO
查看>>
《Layer弹窗加强版》
查看>>
JSP内置对象(9种)
查看>>