Java 字节数组类型(byte[])与int类型互转
代码如下:
public class CommonUtils {
//高位在前,低位在后
public static byte[] int2bytes(int num){
byte[] result = new byte[4];
result[0] = (byte)((num >>> 24) & 0xff);//说明一
result[1] = (byte)((num >>> 16)& 0xff );
result[2] = (byte)((num >>> 8) & 0xff );
result[3] = (byte)((num >>> 0) & 0xff );
return result;
}
//高位在前,低位在后
public static int bytes2int(byte[] bytes){
int result = 0;
if(bytes.length == 4){
int a = (bytes[0] & 0xff) << 24;//说明二
int b = (bytes[1] & 0xff) << 16;
int c = (bytes[2] & 0xff) << 8;
int d = (bytes[3] & 0xff);
result = a | b | c | d;
}
return result;
}
public static void main(String[] args){
int a = -64;
System.out.println("-64="+Integer.toBinaryString(-64));
byte[] bytes = CommonUtils.int2bytes(a);
for(int i = 0 ; i<4 ; i++){
System.out.println(bytes[i]);
}
a = CommonUtils.bytes2int(bytes);
System.out.println(a);
}
}
运行结果如下:
-64=11111111111111111111111111000000
-1
-1
-1
-64
-64
说明1:
-64转化为二进制原码为[10000000][00000000][00000000][01000000]
将原码变为补码为[11111111][11111111][11111111][11000000],与控制台输出结果相同,可以看到在java中二进制以补码的形式表示
-64 >>> 24后(无符号右移,高位补0),变为[00000000][00000000][00000000][11111111]
将上步结果& 0xff后,依然为[00000000][00000000][00000000][11111111],由于0xff的值为[00000000][00000000][00000000][11111111],故& 0xff的目的是将最低8位保持不变,其余位置为0
然后将结果强转为byte类型,保留低位,截去高位,变为[11111111],可以看出上步的0xff其实是没有必要的,无论高位是多少,最终都会被截去
故result[0]为[11111111]=-1
依此类推:
result[1]为[11111111]=-1
result[2]为[11111111]=-1
result[3]为[11000000]=-64
说明2:
byte[0]为[11111111],首先会将byte[0]转化为int类型(在位移运算前,会将byte类型转换为int类型,如果为正数,高位补0,如果为负数,高位补1),高位补1,变为[11111111][11111111][11111111][11111111]
将上步结果& 0xff之后,将变为[00000000][00000000][00000000][11111111]
然后将上步结果 << 24(左位移,低位补0),将变为[11111111][00000000][00000000][00000000] = a
同理获得b、c、d
最终a | b | c | d 即:
[11111111][00000000][00000000][00000000] |
[00000000][11111111][00000000][00000000] | 由于<<16位之前& 0xff,故保证b的最高8位都为0
[00000000][00000000][11111111][00000000] | 由于<<8位之前& 0xff,故保证c的最高16位都为0
[00000000][00000000][00000000][11000000] 由于& 0xff,故保证d的最高24为都为0
=[11111111][11111111][11111111][11000000] = -64
可以看到为了保证byte转换成int时,补位不对最终a | b | c | d的结果产生影响(置为0),& 0xff是必须的
short与byte[]之间的转换,long与byte[]之间的转换也是类似的
PS:
1,int类型占4个字节,而byte类型只占1个字节
2,原码:最高位为符号位,其余位用来表示数值大小
2的原码:00000010
-2的原码:10000010
3,反码:正数的反码与其原码相同;负数的反码符号位保持不变,其余位按位取反
2的反码:00000010
-2的反码:11111101
4,补码:正数的补码与其原码相同;负数的补码为该负数的反码+1
2的补码:00000010
-2的补码:11111110
Java 字节数组类型(byte[])与int类型互转的更多相关文章
- JAVA IO分析二:字节数组流、基本数据&对象类型的数据流、打印流
上一节,我们分析了常见的节点流(FileInputStream/FileOutputStream FileReader/FileWrite)和常见的处理流(BufferedInputStream/B ...
- java中整数的默认为int类型的一些问题
thingking in java 读书感悟 作者 :淮左白衣 写于2018年4月8日17:51:44 关于整数的默认类型,以及会产生的一些小问题 涉及基本数据类型的重载 关于整数的默认类型,以及会产 ...
- Java中返回值定义为int类型的 方法return 1返回的是int还是Integer&&finally中return问题
在Java中返回值定义为int类型的 方法return 1:中返回的是Integer值,在返回的时候基本类型值1被封装为Integer类型. 定义一个Test类,在异常处理try中和finally中分 ...
- Java 中要将 String 类型转化为 int 类型
在 Java 中要将 String 类型转化为 int 类型时,需要使用 Integer 类中的 parseInt() 方法或者 valueOf() 方法进行转换. 例1: 1 2 3 4 5 6 S ...
- System.Buffer 以字节数组(Byte[])操作基元类型数据
1. Buffer.ByteLength:计算基元类型数组累计有多少字节组成. 该方法结果等于"基元类型字节长度 * 数组长度" , , }; , , }; , , }; Cons ...
- java 字节数组转int
4字节数组转int类型 小端模式 /** * 数组转int类型 * * @param src * @return */ public static int bytesToInt(byte[] src) ...
- C#后台接java接口传输字节数组(byte[])
事情是这样的C#t代码之前接的WCF接口,后来那边统一改为java的接口,我是用的HttpClient从后台发请求调用的java接口,其他接口都很顺利,是的....知道遇到一个需要传byte[]类型数 ...
- Java字节数组流学习
字节数组流 基于内存操作,内部维护着一个字节数组,我们可以利用流的读取机制来处理字符串.无需关闭,不会报IOException. ByteArrayInputStream 包含一个内部缓冲区,该缓冲区 ...
- 基于java的InputStream.read(byte[] b,int off,int len)算法学习
public int read(byte[] b, int off, int len) throws IOException 将输入流中最多 len 个数据字节读入字节数组.尝试读取多达 len 字节 ...
随机推荐
- URAL1036. Lucky Tickets
链接 dp[i][j] += dp[i-1][j-g];背包吧 数据太大了 还是JAVA好用 import java.io.*; import java.math.*; import java.tex ...
- Java Memory Management(1)
Java Memory Management, with its built-in garbage collection, is one of the language’s finest achiev ...
- [Hadoop源码解读](六)MapReduce篇之MapTask类
MapTask类继承于Task类,它最主要的方法就是run(),用来执行这个Map任务. run()首先设置一个TaskReporter并启动,然后调用JobConf的getUseNewAPI()判断 ...
- windows权限错误
1.installer "内部错误 2203 C:\WINDOWS\Installer\354787.ipi,-2147287035” 用户的local\Temp目录没有system权限 2 ...
- spring--处理器拦截器详解——跟着开涛学SpringMVC
5.1.处理器拦截器简介 Spring Web MVC的处理器拦截器(如无特殊说明,下文所说的拦截器即处理器拦截器) 类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. ...
- ZOJ3261 Connections in Galaxy War 并查集
分析:对于这种删边操作,我们通常可以先读进来,然后转化离线进行倒着加边 #include <stdio.h> #include <string.h> #include < ...
- GUN/GPL 中文译文
版权所有 (C) 1989,1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307U ...
- 编译 skia
0.准备工作 在 https://android.googlesource.com/ 用 git 代码,当然也可以从skia的官方https://code.google.com/p/skia/ 中获取 ...
- JDK1.5新特性(一)……Enhanced for Loop
援引 Enhanced for Loop - This new language construct eliminates the drudgery and error-proneness of it ...
- sed写的命令收集
1. 替换一行字符串. <title name= > <param name="root", value="haha"/> <pa ...