在Java中将字节数组转换为整数,反之亦然

在Java中将字节数组转换为整数,反之亦然

我想将一些数据存储到Java中的字节数组中。基本上只是每个数字最多可以占用2个字节的数字。

我想知道如何将整数转换为2字节长字节数组,反之亦然。我发现了很多解决方案谷歌搜索,但大多数都没有解释代码中发生了什么。有很多变化的东西,我真的不明白,所以我很感激一个基本的解释。


素胚勾勒不出你
浏览 1260回答 3
3回答

慕森王

使用java.nio命名空间中找到的类,特别是ByteBuffer。它可以为您完成所有工作。byte[] arr = { 0x00, 0x01 };ByteBuffer wrapped = ByteBuffer.wrap(arr); // big-endian by defaultshort num = wrapped.getShort(); // 1ByteBuffer dbuf = ByteBuffer.allocate(2);dbuf.putShort(num);byte[] bytes = dbuf.array(); // { 0, 1 }

慕仙森

byte[]&nbsp;toByteArray(int&nbsp;value)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&nbsp;ByteBuffer.allocate(4).putInt(value).array();}byte[]&nbsp;toByteArray(int&nbsp;value)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;byte[]&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(byte)(value&nbsp;>>&nbsp;24), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(byte)(value&nbsp;>>&nbsp;16), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(byte)(value&nbsp;>>&nbsp;8), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(byte)value&nbsp;};}int&nbsp;fromByteArray(byte[]&nbsp;bytes)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ByteBuffer.wrap(bytes).getInt();}//&nbsp;packing&nbsp;an&nbsp;array&nbsp;of&nbsp;4&nbsp;bytes&nbsp;to&nbsp;an&nbsp;int,&nbsp;big&nbsp;endian,&nbsp;minimal&nbsp;parentheses//&nbsp;operator&nbsp;precedence:&nbsp;<<,&nbsp;&,&nbsp;|&nbsp;//&nbsp;when&nbsp;operators&nbsp;of&nbsp;equal&nbsp;precedence&nbsp;(here&nbsp;bitwise&nbsp;OR)&nbsp;appear&nbsp;in&nbsp;the&nbsp;same&nbsp;expression,&nbsp;they&nbsp;are&nbsp;evaluated&nbsp;from&nbsp;left&nbsp;to&nbsp;rightint&nbsp;fromByteArray(byte[]&nbsp;bytes)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;bytes[0]&nbsp;<<&nbsp;24&nbsp;|&nbsp;(bytes[1]&nbsp;&&nbsp;0xFF)&nbsp;<<&nbsp;16&nbsp;|&nbsp;(bytes[2]&nbsp;&&nbsp;0xFF)&nbsp;<<&nbsp;8&nbsp;|&nbsp;(bytes[3]&nbsp;&&nbsp;0xFF);}//&nbsp;packing&nbsp;an&nbsp;array&nbsp;of&nbsp;4&nbsp;bytes&nbsp;to&nbsp;an&nbsp;int,&nbsp;big&nbsp;endian,&nbsp;clean&nbsp;codeint&nbsp;fromByteArray(byte[]&nbsp;bytes)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;((bytes[0]&nbsp;&&nbsp;0xFF)&nbsp;<<&nbsp;24)&nbsp;|&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((bytes[1]&nbsp;&&nbsp;0xFF)&nbsp;<<&nbsp;16)&nbsp;|&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((bytes[2]&nbsp;&&nbsp;0xFF)&nbsp;<<&nbsp;8&nbsp;)&nbsp;|&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((bytes[3]&nbsp;&&nbsp;0xFF)&nbsp;<<&nbsp;0&nbsp;);}将有符号字节打包到int中时,需要屏蔽掉每个字节,因为由于算术提升规则(在JLS,转换和促销中描述),它被符号扩展为32位(而不是零扩展)。Joshua Bloch和Neal Gafter在Java Puzzlers(“每个字节中的大喜悦”)中描述了一个有趣的谜题。将字节值与int值进行比较时,将字节符号扩展为int,然后将此值与另一个int进行比较byte[]&nbsp;bytes&nbsp;=&nbsp;(…)if&nbsp;(bytes[0]&nbsp;==&nbsp;0xFF)&nbsp;{ &nbsp;&nbsp;&nbsp;//&nbsp;dead&nbsp;code,&nbsp;bytes[0]&nbsp;is&nbsp;in&nbsp;the&nbsp;range&nbsp;[-128,127]&nbsp;and&nbsp;thus&nbsp;never&nbsp;equal&nbsp;to&nbsp;255}请注意,所有数字类型都使用Java签名,但char是16位无符号整数类型。

森林海

您还可以将BigInteger用于可变长度字节。您可以将其转换为long,int或short,以满足您的需求。new&nbsp;BigInteger(bytes).intValue();或表示极性:new&nbsp;BigInteger(1,&nbsp;bytes).intValue();要获取字节只是:new&nbsp;BigInteger(bytes).toByteArray()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java