我先贴出最终转换的代码,再来进行一步一步的介绍:

/*** 将int数值转换为占四个字节的byte数组** @param value 要转换的int值* @return byte数组*/
public static byte[] intToBytes(int value )
{byte[] src = new byte[4];src[0] =  (byte) (value & 0xFF);src[1] =  (byte) ((value>>8) & 0xFF);src[2] =  (byte) ((value>>16) & 0xFF);src[3] =  (byte) ((value>>24) & 0xFF);return src;
}/*** byte数组中取int数值** @param src byte数组* @return int数值*/
public static int bytesToInt(byte[] src) {int value;value = (int) ((src[0] & 0xFF)| ((src[1] & 0xFF)<<8)| ((src[2] & 0xFF)<<16)| ((src[3] & 0xFF)<<24));return value;
}

注意:这里不知道大家有没有留意到,在byte转int的时候,每个字节都向左依次移位 0 8 16 24,他们之间用 | 运算符连接,为什么是 | 运算符连接呢?其实 | 运算符在他们之间起到了“拼接”的效果,比如 1111 0000 0000 0000 & 0000 1111 0000 0000 = 1111 1111 0000 0000,在视觉上起到了“拼接”的效果,这样我们就可以通过这种方式把 byte数组还原为 int 了(其实就是把byte数组还原为正确的int 32 位二进制表示,然后再将二进制表示形式强转为 int 表示形式就可以了),下面我也会介绍到这个运算符的作用。

int

int在Java中是用32位来表示的并且占据4个字节,最高位是表示符号,所以真正可以表示数字的是31位。

byte

占1个字节,byte在Java中是用8位来表示的。数据是8位带符号的二进制数。在计算机中,8位带符号二进制数的取值范围是[-128, 127],所以在Java中,byte类型的取值范围也是[-128, 127]。

运算符

java中有三种移位运算符

<<      :     左移运算符,num << 1,相当于num乘以2>>      :     右移运算符,num >> 1,相当于num除以2>>>    :     无符号右移,忽略符号位,空位都以0补齐

&

对两个数进行操作,然后返回一个新的数,这个数的每个位都需要两个输入数的同一位都为1时才为1

A:   1111000
B:    0011100
A&B:    0011000

|

是把某两个数中, 只要其中一个的某一位为1,则结果的该位就为1;

A:     1111001
B:      0011100
A|B:    1111001

oxff

16进制的255,2进制的11111111,&oxff后的作用我认为是,得到低8位

A:     11100000 101111110
0xff:  11111111
A&0xff: 101111110

二进制知识

位移运算计算机中存的都是数的补码,所以位移运算都是对补码而言的原码对于二进制数,最高位为符号位,0表示正数,1表示负数,剩余数值部分是真值。反码对于二进制数,正数的反码就是它本身,负数的反码除符号位外按位取反。补码对于二进制数,正数的补码就是它本身,负数的补码符号位取一,数值部分按位取反后末位加一。

解析

int转byte[ ]

所以当int想转换为byte,我们需要一个长度为4的byte型数组来对其进行存储。

int为4字节所以字节位分为0位到7位,8位到15位,16到23位,24到31位。

所以可以byte[0]存储 0-7位 ,byte[1]存储8-15位,byte[2]存储16-23位,byte[3]存储24-31位,用&0xff取对应位的数据

转换成代码就是

src[0] =  (byte) (value & 0xFF);
src[1] =  (byte) ((value>>8) & 0xFF);
src[2] =  (byte) ((value>>16) & 0xFF);
src[3] =  (byte) ((value>>24) & 0xFF);

举个例子 (value>>8) & 0xff  就是把32位的int向右移动8位   就是去掉了0到7位   再&0xff 就是截取低8位也就是现在的8-15位,最终就是取到8-18位的数据。

a             00000000 00000000 10000000 11111111
a>>8          00000000 00000000 00000000 10000000
(a>>8)&0xff   10000000

byte[ ]转int

Java in think中有下面一句话:

若对char,byte 或者short 进行移位处理,那么在移位进行之前,它们会自动转换成一个int(32位)。只有右侧的5 个低位才会用到。这样可防止我们在一个int 数里移动不切实际的位数。

所以当我们对一个byte型进行移位操作的时候,这个byte型会先自动补全到32位,操作符的结果跟int转byte[]类似。

操作时,相当于要把我们上面int转byte[]时 那里面的4个字节又取出来重新组成一个32位的int,用运算符“与”,合并4个8位的bye(byte[0]存储 0-7位 ,byte[1]存储8-15位,byte[2]存储16-23位,byte[3]存储24-31位),也就得到最终的int数

我举个列子

byte  a             0000000 00000000 00000000 11111111(a&0xff)      11111111(a&0xff)<<8   0000000 00000000  11111111 00000000

到这大部分就解释完了,如果有你们认为不恰当的地方,欢迎留言,加油!

Java语言Int与byte[]互转详解分析相关推荐

  1. java int byte数组_Java 中int与byte数组转换详解

    1.与运算符的理解(&): 参加运算的两个数据,按二进位进行"与"运算.如果两个相应的二进位都为1,则该位的结果值为1,否则为0.即 0&0=0:0&1=0 ...

  2. java static int a_java中static作用详解

    static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static ...

  3. java语言say方法,简单了解Java方法的定义和使用实现详解

    简单了解Java方法的定义和使用实现详解 发布时间:2020-09-25 11:36:07 来源:脚本之家 阅读:78 作者:OLIVER_QIN 这篇文章主要介绍了简单了解Java方法的定义和使用实 ...

  4. c语言 int与byte[]互相转换

    gdb调试 root@ubuntu:/media/mtk6795/alps/sunwave_pub# gcc -g test.c root@ubuntu:/media/mtk6795/alps/sun ...

  5. c语言整数转ip地址字符串,C/C++ ip地址与int类型的转换实例详解

    C/C++ ip地址与int类型的转换实例详解 前言 最近看道一个面试题目,大体意思就是将ip地址,例如"192.168.1.116"转换成int类型,同时还能在转换回去 思路 i ...

  6. c语言二级指针有什么作用,C语言中二级指针的实例详解

    C语言中二级指针的实例详解 C语言中二级指针的实例详解 用图说明 示例代码: #include int main(int argc, const char * argv[]) { // int a = ...

  7. 2017年 第8届 蓝桥杯 Java B组 省赛真题详解及总结

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...

  8. Go 语言快速开发入门(基础语法详解,第一节)

    Go 语言快速开发入门(基础语法详解,第一节) 一.基础语法详解,第一节 1.HelloWorld 1.1.代码编写和解释 1.2.go语言注意事项 2.Go 语言的转义字符&&Go ...

  9. 2020年 第11届 蓝桥杯 Java C组 省赛真题详解及小结【第1场省赛 2020.7.5】

    蓝桥杯 Java B组 省赛真题详解及小结汇总[2013年(第4届)~2020年(第11届)] 注意:部分代码及程序 源自 蓝桥杯 官网视频(历年真题解析) 郑未老师. 2013年 第04届 蓝桥杯 ...

最新文章

  1. 网速测量、流量监控软件 Bandwidth Meter Pro
  2. 如何开始使用centos_如何开始使用CentOS
  3. 中国顶级AI盛会,10月魔都等你来解密!
  4. element-ui可编辑行增加行或删除行
  5. 拓端tecdat|R语言状态空间模型:卡尔曼滤波器KFAS建模时间序列
  6. Rtklib-rinex文件的读取(rinex.c)-序言
  7. SecureCRT 破解版v7.1.1.264中文汉化绿色版
  8. c# 文件服务器压缩图片,C#高质量无损压缩图片代码同享
  9. Latex写科技论文小技巧--修改稿件
  10. Python语言程序设计基础-题库
  11. 求两个数的最大公因数与最小公倍数
  12. 开源软件的安全性风险_认真对待开源安全性
  13. [Android实例] Android有效解决加载大图片内存溢出问题及优化虚拟机内存
  14. 2018年11月25日ICPC焦作站参赛总结
  15. 开正式发票到底谁交税
  16. r和python培训
  17. 大爱伟业协同办公系统项目的感想
  18. 词云中去重复的词_李清照特别经典的词,把相思写得淋漓尽致,读一次心疼一次...
  19. win10修改默认文件管理器
  20. python生成一笔画_Python系列—一笔画问题的算法研究

热门文章

  1. 串行 RapidIO接口介绍
  2. C#好书盘点【月儿原创】
  3. 基于用户画像的电影推荐系统论文
  4. “笨办法”学Python 3基础篇-文件操作
  5. 05. HAXM is not installed
  6. Live800:在线客服系统如何帮助企业创造持续的服务价值?
  7. 容器进程(QQExternal)
  8. 为bib文件中文参考文献的key域添加排序用拼音
  9. 如何安全的修改win11用户名(微软账号登录,用户名会变成纯数字,好丑)
  10. 关于牛客网代码题 数据读取问题的 小白指南