java中byte数组怎么转换成int类型数组

王无码 2017-12-06 10:09:40
一般从文档中读取数据或者从网络上接受数据,都是存放在byte类型的数组中。
但这些数据的实际含义一般是整型类型,怎么把byte数组转换成整型呢?

在C++中可以直接使用强制类型转换(void指针类型转换成int指针类型),Java中强制类型转换会报错(byte[]转换成int{}类型不匹配)。
在C++中有memcpy可以按照内存进行拷贝。我尝试用Java的System.arraycopy进行拷贝,结果运行时抛出java.lang.ArrayStoreException异常。
除了用循环一个数字一个数字的转换外,有什么简单的方法吗?理论上整块内存拷贝一下就好了,没必要一个一个位移拼接。
...全文
4511 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zoeg 2018-03-18
  • 打赏
  • 举报
回复
发完楼上的,又看了一遍楼主的后续回复,我觉得你要的是

InputStream is=socket.getInputStream();
DataInputStream dis=new DataInputStream(is);
int v=dis.readInt();//这里会一次性消耗4个byte,按网络字节序组装成一个int类型
long l=dis.readLong();//同理
你做过C的,网络字节序和CPU字节序我就不解释了
zoeg 2018-03-18
  • 打赏
  • 举报
回复 1
楼主是做网络接口开发么? 网络Socket或者Http什么的通讯,除了UDP外,其他的都会提供原始IO流的 比如InputStream is=Socket.getInputStream() 不知你的困惑是否在于如何从is中读取你需要的数据 而且你不知道对方到底会给你发送多少数据,你感觉你定义多大的bytes都被坑 如果是这样的话,建议你仔细看一下java.io.*这个包中的内容,不要用C语言的习惯来处理 我随便举几个例子供你参考: 如果你希望读取字符串:isr=new InputStreamReader(is) 如果你还希望继续把字符串按行读取:br=new BufferedReader(isr); 如果你希望从流中读取具化的内容: dis=new DataInputStream(is) 然后你可以直接dis.readInt(),dis.readLong(),dis.readObject()等等 如果你确实只要预先loading所有字节,你可以先创建一个 baos=new ByteArrayOutputStream() 然后不断地从流读入并写入baos,然后baos可以提供给你更灵活的操作。
昵称都用完了 2018-02-21
  • 打赏
  • 举报
回复
java很重要一个特点是没有指针,就是没有办法直接对内存进行操作。 还有就是强类型语言。byte 型赋值给int没有问题。但是byte[]和int[]不存在 IS-A关系,所以你的强制类型转换失败了。 所以就循环赋值吧,好像没啥好办法。
losswolf 2018-02-17
  • 打赏
  • 举报
回复
不开辟新内存,直接在byte[] 占的内存里进行修改么?
youyouke 2018-02-15
  • 打赏
  • 举报
回复
得用循环一个一个的赋值,最好加上个类型判断,象你说的“理论上整块内存拷贝一下就好了”应该是实现不了
王无码 2018-02-14
  • 打赏
  • 举报
回复
你们给的方法都需要开另外一块内存,如果内存不够了就搞不定了。还要复制一遍,浪费时间。
soton_dolphin 2018-02-14
  • 打赏
  • 举报
回复
引用 11 楼 qq_19259415 的回复:
你们给的方法都需要开另外一块内存,如果内存不够了就搞不定了。还要复制一遍,浪费时间。
转数组类型,必须得另外用一块内存啊。
无聊的上午 2018-02-14
  • 打赏
  • 举报
回复
public static void main(String[] args) {
		byte [] b = {1,2,3};
		int [] a = new int[3];
		for (int i = 0; i < b.length; i++) {
			a[i] = b[i];
		}
		for (int i : b) {
			System.out.println(i);
		}
	}
敢问上面讨论那么多没用的同学一个问题,byte是不是数字类型,小转大需要这么复杂?
chengshou2106 2017-12-23
  • 打赏
  • 举报
回复
不懂为什么要转换,直接新建一个把值写进去不好了吗
天边龙一条 2017-12-23
  • 打赏
  • 举报
回复 1
int类型数据在Java中占据32 bit,byte占据8 bit,这样的话,正常情况下4个byte可以转换成一个int类型数据。 当然,不正常情况下,3个byte或者2个byte甚至1个byte都可以转换为int数据,只需要高位补上就行。 嗯,坑来了。由于Java中int类型是有符号的,最高位为符号位,为0的话表示正数,为1的话表示负数。 以四位byte数组为例,要拼接成一个32 bit的int数据的话,只需要将四个byte按顺序连接起来就行,这样的话,就需要对四个byte进行移位操作。 第一位左移24位,第二位左移16位,第三位左移8位,第四位不动。。然后进行或运算。。 嗯,看起来好像完美。。。然而之前说过Java是有符号的,对于后三个byte,如果是负数的话,则高位都是1,这样高位的或运算将失效,前面的byte数据也就没有意义。 因此,对于后三个byte数据,进行移位操作前需要和0XFF进行与运算,消除高24位。 对于不正常的情况,比如3个byte转换为int,则第一个左移16位,第二位与0xff后左移8位,第三位与0xff,然后进行或运算即可。 同理可运用于2个byte。 对于1个byte,直接强制转换为int即可。 嗯。。大概就是这样,第一位移位,之后的分别和0xff相与后再移位,最后进行或运算即可。 如果一个byte数组超过4位后,怎么办?当然返回一个int数组就行啦,反正4位byte转换成1个int,看着办就行。
public int[] bytesToInts(byte[] bytes){  
        int bytesLength=bytes.length;  
        int[] ints=new int[bytesLength%4==0? bytesLength/4:bytesLength/4+1];  
        int lengthFlag=4;  
        while (lengthFlag<=bytesLength){  
            ints[lengthFlag/4-1]=(bytes[lengthFlag-4]<<24)|(bytes[lengthFlag-3]&0xff)<<16|  
                    (bytes[lengthFlag-2]&0xff)<<8|(bytes[lengthFlag-1]&0xff);  
            lengthFlag+=4;  
        }  
        for (int i=0;i<bytesLength+4-lengthFlag;i++){  
            if (i==0) ints[lengthFlag/4-1]|=bytes[lengthFlag-4+i]<<8*(bytesLength+4-lengthFlag-i-1);  
            else ints[lengthFlag/4-1]|=(bytes[lengthFlag-4+i]&0xff)<<8*(bytesLength+4-lengthFlag-i-1);  
        }  
        return ints;  
    }
上代码,求分
ddddouche 2017-12-08
  • 打赏
  • 举报
回复
如果确认转换之前的内容是int的话,可以先把byte转字符串再用integer.valueof的方法去转换。关键是异常的处理
天之上有什么 2017-12-06
  • 打赏
  • 举报
回复
foreach遍历挺快的
wzd_10010 2017-12-06
  • 打赏
  • 举报
回复
byte范围比int小你可以直接把byte数组里的数据赋值给int类型的数组就好了,可以把它定义为一个方法,直接调用方法得到的不就是int类型数组了吗
thinking code 2017-12-06
  • 打赏
  • 举报
回复
byte是8bit,int是32bit,怎么会是一样的呢
Clumsy__Cat 2017-12-06
  • 打赏
  • 举报
回复
byte可以转为int,循环处理下byte数组就行了
自由自在_Yu 2017-12-06
  • 打赏
  • 举报
回复
byte[] by1 = {1,2,3,4,5,6,7,8,9,10}; int[] in1 = new int[by1.length]; for (int i = 0; i < in1.length; i++) { in1[i] = by1[i]; }
王无码 2017-12-06
  • 打赏
  • 举报
回复
好吧,看来只能循环复制一份了
W_ILU 2017-12-06
  • 打赏
  • 举报
回复
可以看看这个 http://blog.csdn.net/defonds/article/details/8782785

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧