文档章节

Java int 与 byte的转换 & 0xFF

秋风醉了
 秋风醉了
发布于 2016/09/29 14:26
字数 776
阅读 175
收藏 1

Java int 与 byte的转换 & 0xFF

int -> byte

采用强制类型转换 byte 类型的取值范围是 -128~127。当把int转换成byte时,超出这个范围,值就不会相等。

int ii = 128;
byte bb = (byte) ii;
System.out.println(ii == bb); //false

int iii = 127;
byte bbb = (byte) iii;
System.out.println(iii == bbb);//true

通过InputStream的read()方法获取的int,可采用强制类型转换将值还原为byte类型,

/**
 * Reads the next byte of data from the input stream. The value byte is
 * returned as an <code>int</code> in the range <code>0</code> to
 * <code>255</code>. If no byte is available because the end of the stream
 * has been reached, the value <code>-1</code> is returned. This method
 * blocks until input data is available, the end of the stream is detected,
 * or an exception is thrown.
 *
 * <p> A subclass must provide an implementation of this method.
 *
 * @return     the next byte of data, or <code>-1</code> if the end of the
 *             stream is reached.
 * @exception IOException  if an I/O error occurs.
 */
public abstract int read() throws IOException;

注意这个int 值的范围是 0~255,转换成byte,不会超出byte的位的长度。

byte -> int

这里有两种情况,一种是要求保持值不变,例如进行数值计算,可采用强制类型转换:int i = (int) aByte; 另一种是要求保持最低字节中各个位不变,3个高字节全部用0填充,例如进行编解码操作, 则需要采用位操作:int i = b & 0xff;

通过ByteArrayInputStream的read()方法,通过位操作将byte转换为int,

/**
 * Reads the next byte of data from this input stream. The value
 * byte is returned as an <code>int</code> in the range
 * <code>0</code> to <code>255</code>. If no byte is available
 * because the end of the stream has been reached, the value
 * <code>-1</code> is returned.
 * <p>
 * This <code>read</code> method
 * cannot block.
 *
 * @return  the next byte of data, or <code>-1</code> if the end of the
 *          stream has been reached.
 */
public synchronized int read() {
    return (pos < count) ? (buf[pos++] & 0xff) : -1;
}

int <-> byte[]

public class Transfer {

    public static byte[] toByteArray(int iSource, int iArrayLen) {
        byte[] bLocalArr = new byte[iArrayLen];
        for (int i = 0; (i < 4) && (i < iArrayLen); i++) {
            bLocalArr[i] = (byte) (0xFF & (iSource >>> (i << 3)));
        }
        return bLocalArr;
    }

    public static int toInt(byte[] bRefArr) {
        int iOutcome = 0;
        byte bLoop;

        for (int i = 0; i < bRefArr.length; i++) {
            bLoop = bRefArr[i];
            iOutcome += (bLoop & 0xFF) << (i << 3);
        }
        return iOutcome;
    }

    public static void main(String args[]) {
        int a = 100;
        byte[] arr = toByteArray(a, 4);
        int b = toInt(arr);
        System.out.println(b);
    }
}

为什么要和 0xFF 进行与操作

以这个为例,

public static byte[] toByteArray(int iSource, int iArrayLen) {
    byte[] bLocalArr = new byte[iArrayLen];
    for (int i = 0; (i < 4) && (i < iArrayLen); i++) {
        bLocalArr[i] = (byte) (0xFF & (iSource >>> (i << 3)));
    }
    return bLocalArr;
}

int类型在java中用8个字节32位来表示,byte类型为一个字节8位。我们要做的就是将32位分四次,每次获取8位写入到字节数组中。首先是低8位,和0xFF相与后,高24比特就会被置为0了,写入到字节数组中。然后获取后边的8位,首先要移位,无符号右移8位,和0xFF相与后,保留8位,把这八位写入到数组中。后边依次类推。最终完整的把int写入到字节数组中。

=========END=========

© 著作权归作者所有

秋风醉了
粉丝 252
博文 532
码字总数 405694
作品 0
朝阳
程序员
私信 提问
C 和 Java 之间的byte数据的转换问题

C语言里通常可能开发人员直接定义struct 作为数据包, 因此在java客户端接收struct 中的数据时候,受整数等类型的高低位存放的影响, 需要进行相应的转换, 参考: http://www.ibm.com/developerw...

Simon253
2013/08/13
1K
0
java Byte和各数据类型(short,int,long,float,double)之间的转换

在Java的网络编程中传输的经常是byte数组,但我们实际中使用的数据类型可能是任一种数据类型,这就需要在它们之间相互转换,转换的核心在于将其他类型的数据的每一位转换成byte类型的数据。下...

phacks
2015/01/23
922
0
Java中byte与16进制字符串的互相转换

Java中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示(23 + 22 + 21 + 20 = 15),所以我们就可以把每个byte转换成两个相应的16进制字符,即把byte的高4位和...

毛朱
2013/12/09
4.5K
0
php实现java的byte数组转换 附带java解密代码和php解密代码

php实现java的byte数组转换 由于工作需要,在网上找了个php实现java的byte数组转换的类。对照java的byte数组,发现两个结果是一致的,证明好使。附加上我的用php实现java附件解密代码 <?php ...

李佳顺
2014/01/03
47
0
Java中byte与16进制字符串的互相转换

ava中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示(23 + 22 + 21 + 20 = 15),所以我们就可以把每个byte转换成两个相应的16进制字符,即把byte的高4位和低...

zhangyujsj
2013/11/26
15.4K
1

没有更多内容

加载失败,请刷新页面

加载更多

Mybatis Plus删除

/** @author beth @data 2019-10-17 00:30 */ @RunWith(SpringRunner.class) @SpringBootTest public class DeleteTest { @Autowired private UserInfoMapper userInfoMapper; /** 根据id删除......

一个yuanbeth
42分钟前
4
0
总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
今天
4
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
今天
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部