二进制-java类型转化之int转换为byte[]

问题描述

java类型转化之int转换为byte[]

小白想请问一个问题:
java中将int转换为byte[]数组时,我参考网上的代码如下:
public byte[] int2bytes(int Num){
byte[] bytes = new byte[4];
bytes[0] = (byte)(Num & 0xff);
bytes[1] = (byte)((Num >> 8) & 0xff );
bytes[2] = (byte)((Num >> 16) & 0xff);
bytes[3] = (byte)((Num >> 24) & 0xff);
return bytes;
}


我想问的是,之后的0xff的作用到底是什么。
我的疑惑如下:
①网上的说法是:0xff的二进制第一个字节11111111,其他三个字节均是0,按位与之后,将位运算之后的int低8位之外的24位清零,可是int强制转换为byte是只取了最后的低8位吧,那么前面的是不是0是有什么关系呢。如下:
原数据int: 00000000 00101001 00001010 00010110
位运算>>8: 00000000 00000000 00101001 00001010
& 0xff : 00000000 00000000 00000000 00001010
转换byte : 00001010

按照这样的流程,如果不进行& 0xff操作,直接将位运算之后强制转换,结果应该如下:
原数据int: 00000000 00101001 00001010 00010110
位运算>>8: 00000000 00000000 00101001 00001010
转换byte : 00001010

既然网上的代码都是这样写,肯定有其中的道理,那么我的理解错误点在哪里呢?

②我将此段代码,传参-1024调用,并循环输出byte[4]的元素发现返回结果是一样的
有&0xff:0 -4 -1 -1
无&0xff:0 -4 -1 -1

还请指点,非常感谢。

更新:我后来想了下。觉得这应该是从别的语言里面借鉴过来的写法。
在java中byte的取值范围是127~-128,而int为4个byte,那么可能在位运算之后,不进行& 0xff按位与之后可能存在int的第一个字节和第二个字节均不为零的情况,那么此时int的值实际上是超过了byte的取值范围,在别的语言里可能会造成溢出。
但是,我刚试验过了。java中实际上这种转换不会抛出错误,比如直接将280转换成byte,则直接砍掉前面的14位,只取后面8位。

解决方案

之后的0xff的作用就是只取最后的一个字节,相当于

bytes[1] = (byte)((Num >> 8) & 0xff );
->
bytes[1] = (byte)((Num >> 8) % 256 );
->
bytes[1] = (byte)((Num / 256) % 256);
这些都是一回事

解决方案二:

java int 与 byte[] 转化
Java 将byte[] 与int类型互相转换
java int 与 byte转换

解决方案三:

http://m.baidu.com/from=1011267l/bd_page_type=1/ssid=0/uid=0/pu=usm%400%2Csz%401320_1004%2Cta%40iphone_2_4.4_11_2.1/baiduid=E1E24D25789A1BF3D13A7BCDA95199D3/w=0_10_int%E5%BC%BA%E8%BD%ACbyte%E4%BC%9A%E5%BC%82%E5%B8%B8%E5%90%97/t=iphone/l=3/tc?ref=www_iphone&lid=9113330595732391645&order=6&vit=osres&tj=www_normal_6_0_10_title&m=8&srd=1&cltj=cloud_title&dict=30&title=Java%E4%B8%ADbyte%E8%BD%AC%E6%8D%A2int%E6%97%B6%E4%B8%8E0xff%E8%BF%9B%E8%A1%8C%E4%B8%8E%E8%BF%90%E7%AE%97%E7%9A%84%E5%8E%9F%E5%9B%A0_%E4%BA%92%E5%8A%A8%E7%99%BE%E7%A7%91&sec=6759&di=5f7310f9faf7abb5&bdenc=1&tch=124.233.264.1025.2.529&tch=124.180.300.989.3.1469&nsrc=IlPT2AEptyoA_yixCFOxXnANedT62v3IENiTNCVP28SxokDyqRLDBrVeYUTsSpm91l80-Yarhw2NhCn8
你可以多试几个值,看是否结果还是一样,由于在床上,我无法进行实验,你自己试试吧。

解决方案四:

你去看看位操作吧。。。

解决方案五:

主要是int是多字节数据,在java中是四个字节,所谓int转字节数组,就是顺次将int的四个字节的二进制数据按8位为单位存储成4个byte数据而已。
用0xFF相与后的结果仍然是4个字节,那么最后一个字节的数据就是byte转换后的数据,前面的3个字节就清零了。
int强制转换为byte是只取了最后的低8位,但是它是为了保证数据截断的正确,防止高位溢出的。

解决方案六:

0xff的作用就是只取最后的一个字节

时间: 2024-09-17 04:53:38

二进制-java类型转化之int转换为byte[]的相关文章

java-无法将类型“int”隐式转换为“byte”。

问题描述 无法将类型"int"隐式转换为"byte". byte a = 1; byte b = 2; byte c = 3; a = b + c; 为什么最下面b,c变成int型了呢= = 解决方案 byte 表示一个字节,他的表示范围[-128 127], byte a = 1; byte b = 2; byte c = 3; 都在这个范围之内,没有问题. 这里还有一个问题 就是我们写的整数,没有明确指出类型(比如说 byte b = 2;中的2) 系统默认是i

Java 类型相互转换byte[]类型,Blob类型详细介绍_java

在我们的程序开发当中,经常会用到java.sql.Blob.byte[].InputStream之间的相互转换,但在JDK的API当中,又没有直接给我们提供可用的API,下面的程序片段主要就是实现它们之间互换的util. 一.byte[]=>Blob 我们可以通过Hibernate提供的表态方法来实现如: org.hibernate.Hibernate.Hibernate.createBlob(new byte[1024]); 二.Blob=>byte[] 目前没有找到好一点的API提供,所以

java int转byte和long转byte的方法_java

在网络编程中,出于节约带宽或者编码的需要,通常需要以原生方式处理long和int,而不是转换为string. public class ByteOrderUtils { public static byte[] int2byte(int res) { byte[] targets = new byte[4]; targets[3] = (byte) (res & 0xff);// 最低位 targets[2] = (byte) ((res >> 8) & 0xff);// 次低

为什么link中byte可以转换为int,int不能转换为byte?

问题描述 为什么link中byte可以转换为int,int不能转换为byte? 为什么link中byte可以转换为int,int不能转换为byte? 解决方案 为什么杯子中的水可以倒在脸盆里,为什么脸盆里的水不能倒在杯子里? 解决方案二: 可以强制转换,但转换后的结果可想而知: 如果 int 的数值在 byte 类型取值范围之内,结果还是一样的. 否则,数值被截取.按 C 语言的规则,取 int 的低字节数值赋值到 byte.

如何将二进制字符串转换为byte[]?

问题描述 byte[] b = new byte[fis.available()];StringBuilder str = new StringBuilder();fis.read(b);for(byte bs:b){ str.append(Integer.toBinaryString(bs));//转换为二进制 }fis.close();我通过这种方式将一个byte[]转换为二进制的字符串.里面全是0和1字符.现怎么将这种二进制字符串转换为byte[]数组?我知道有其它将byte[]和字符串之

请问如何将IntPtr内容转换为byte[]类型

问题描述 小弟目前基于Unity平台研究C++dll图像处理内容,目前用IntPtr获取了图像数据,请问如何转换为byte[]类型的数据,用以在Unity中显示图像? 解决方案 解决方案二:Marshal的方法.或者在使用的函数中,直接使用byte[]来代替IntPtr,当然不是简单的代替.解决方案三:照你的方法,然后texture.LoadImage(byte[]);的方法加载图像显示,结果出现个红色问号,这....解决方案四:贴出你的byte[]头部一些字节的数据,看看是否传递正确

java中进制的转换,Byte与16进制的转换方法_java

java中对于进制的转换有很多方式,其中对于常见的基本的二进制 八进制 十进制 十六进制等的转换有对于的包装类实现,不需要通过二外的算法来进行实现,具体如下: 首先关于最简单的二进制转换的方法有: 十进制转成十六进制: String Integer.toHexString(int i) 十进制转成八进制 String Integer.toOctalString(int i) 十进制转成二进制  String Integer.toBinaryString(int i) 十六进制转成十进制 Inte

java-Oracle读取二进制BLOB类型数据出现乱码

问题描述 Oracle读取二进制BLOB类型数据出现乱码 JAVA中,读取Oracle中二进制BLOB类型数据,出现乱码.. 如果BLOB是文本类型存储的就不会存在乱码 BLOB blob = (oracle.sql.BLOB)rs.getBlob(""ys1""); try{ FileOutputStream outStream = new FileOutputStream(""c:/oracleback1.txt"");

java字符串转化小白求解!

问题描述 java字符串转化小白求解! 输入个人信息,将出生日期中的月日用*代替并输出. 老师出的题,做了4个多小时,实在不会做了,求教各位大神! 解决方案 Date的构造函数中,年是以1900开始的,因此输入的年份要减去1900,月份是0-11代表12个月,0代表1月份,因此输入的月份要减1.日是完全对应. int year = 1996; int month = 10; int day = 11; Date date = new Date(year - 1900 month - 1 day)