在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;