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

我想存储一些数据到Java中的bytearrays。 基本上只需要每个数字可以占用2个字节的数字。

我想知道如何将一个整数转换为一个2字节长的byterayray,反之亦然。 我发现了很多解决scheme,但是大多数解决scheme都不能解释代码中会发生什么。 有很多转变的东西,我不明白,所以我会很感激一个基本的解释。

使用java.nio命名空间中的java.nio ,特别是ByteBuffer 。 它可以为你做所有的工作。

 byte[] arr = { 0x00, 0x01 }; ByteBuffer wrapped = ByteBuffer.wrap(arr); // big-endian by default short num = wrapped.getShort(); // 1 ByteBuffer dbuf = ByteBuffer.allocate(2); dbuf.putShort(num); byte[] bytes = dbuf.array(); // { 0, 1 } 
 byte[] toByteArray(int value) { return ByteBuffer.allocate(4).putInt(value).array(); } byte[] toByteArray(int value) { return new byte[] { (byte)(value >> 24), (byte)(value >> 16), (byte)(value >> 8), (byte)value }; } int fromByteArray(byte[] bytes) { return ByteBuffer.wrap(bytes).getInt(); } // packing an array of 4 bytes to an int, big endian int fromByteArray(byte[] bytes) { return bytes[0] << 24 | (bytes[1] & 0xFF) << 16 | (bytes[2] & 0xFF) << 8 | (bytes[3] & 0xFF); } 

将带符号字节装入一个int时,由于算术提升规则(在JLS,转换和促销中描述),每个字节需要被屏蔽掉,因为它被符号扩展到32位(而不是零扩展)。

在Joshua Bloch和Neal Gafter撰写的“Java Puzzlers”(“每个字节中的大乐趣”)中描述了一个有趣的难题。 当比较一个字节值和一个int值时,该字节被符号扩展为一个int,然后这个值与另一个int进行比较

 byte[] bytes = (…) if (bytes[0] == 0xFF) { // dead code, bytes[0] is in the range [-128,127] and thus never equal to 255 } 

请注意,所有数字types都是用Java签名的,char是一个16位无符号整数types。

您也可以使用BigInteger获取可变长度的字节。 您可以将其转换为long,int或short,以适合您的需求为准。

 new BigInteger(bytes).intValue(); 

或表示极性:

 new BigInteger(1, bytes).intValue(); 

只需要返回字节:

 new BigInteger(bytes).toByteArray() 

一个基本的实现将是这样的:

 public class Test { public static void main(String[] args) { int[] input = new int[] { 0x1234, 0x5678, 0x9abc }; byte[] output = new byte[input.length * 2]; for (int i = 0, j = 0; i < input.length; i++, j+=2) { output[j] = (byte)(input[i] & 0xff); output[j+1] = (byte)((input[i] >> 8) & 0xff); } for (int i = 0; i < output.length; i++) System.out.format("%02x\n",output[i]); } } 

为了理解事情,你可以阅读这篇WP文章: http : //en.wikipedia.org/wiki/Endianness

上面的源码会输出34 12 78 56 bc 9a 。 前两个字节( 34 12 )表示第一个整数等等。上面的源代码以little endian格式编码整数。

 /** length should be less than 4 (for int) **/ public long byteToInt(byte[] bytes, int length) { int val = 0; if(length>4) throw new RuntimeException("Too big to fit in int"); for (int i = 0; i < length; i++) { val=val<<8; val=val|(bytes[i] & 0xFF); } return val; } 

我认为这是一个最好的模式投给int

  public int ByteToint(Byte B){ String comb; int out=0; comb=B+""; salida= Integer.parseInt(comb); out=out+128; return out; } 

首先将字节转换为string

 comb=B+""; 

下一步是转换为int

 out= Integer.parseInt(comb); 

但是这个reasone的字节在-128到127的范围内,我认为最好使用0到255的范围,你只需要这样做:

 out=out+256;