我有两种方法,其中一种方法将Integer转换为字节数组,另一种方法将字节数组转换为整数。 但是当我将字节数组的长度定义为小于4时,我得到了一个异常。 我怎样才能修复我的两种方法。
public class Test {
public Test() {
}
public static int getIntegerFromByte(byte[] byteArr) {
return (byteArr[0] ) << 24 | (byteArr[1] & 0xFF) << 16 | (byteArr[2] & 0xFF) << 8 | (byteArr[3] & 0xFF);
}
public byte[] getByteArrayFromInteger(int intValue ,int byteArrSize) {
ByteBuffer wrapped = ByteBuffer.allocate(byteArrSize);
wrapped.putInt(intValue);
byte[] byteArray = wrapped.array();
return byteArray;
}
public static void main (String []args) throws IOException {
Test app = new Test();
byte [] b = app.getByteArrayFromInteger(1, 3);
System.out.println("Length of Byte:\t"+ b.length+ "\n Value: \t"+ getIntegerFromByte(b));
byte [] byteArr = new byte[3];
byteArr[0] = 0;
byteArr[1] = 0;
byteArr[2] = 1;
System.out.println("Length of Byte:\t"+ byteArr.length+ "\n Value: \t"+ getIntegerFromByte(byteArr));
}
}
由于
答案 0 :(得分:1)
int
是4个字节。来自ByteBuffer.putInt()
在当前字节中写入包含给定int值的四个字节 在当前位置进入此缓冲区,然后递增 四个位置。
并抛出:
BufferOverflowException - 如果剩余的字节少于四个 在这个缓冲区
答案 1 :(得分:1)
您很可能尝试将32位(4字节)int
值写入3字节数组。您的getIntegerFromByte
需要一个至少4个字节的数组。
尝试
byte[] b = app.getByteArrayFromInteger(1, 4);
答案 2 :(得分:0)
这是因为对于转换,你使用长度为4的字节数组,如果你给出较小的大小,它将提供与越界相关的异常....
答案 3 :(得分:0)
尝试这样: -
byte [] b = app.getByteArrayFromInteger(0, 3);
答案 4 :(得分:0)
可以写出这样的东西来摆脱长度的依赖吗?
public static int getIntegerFromByte(byte[] byteArr) {
return getIntegerFromByte(0, byteArr);
}
public static int getIntegerFromByte(int sum, byte[] byteArr) {
if (byteArr.length == 0)
return sum;
sum = (sum << 8) + (byteArr[0] & 0xFF);
return (getIntegerFromByte(sum, Arrays.copyOfRange(byteArr, 1, byteArr.length)));
}
public byte[] getByteArrayFromInteger(int intValue) {
ByteBuffer wrapped = ByteBuffer.allocate(4);
wrapped.putInt(intValue);
return wrapped.array();
}
public static void main (String []args) throws IOException {
Test app = new Test();
byte [] b = app.getByteArrayFromInteger(2);
System.out.println("Length of Byte:\t"+ b.length+ "\n Value: \t"+ getIntegerFromByte(b));
byte [] byteArr = new byte[]{0,1,0};
System.out.println("Length of Byte:\t"+ byteArr.length+ "\n Value: \t"+ getIntegerFromByte(byteArr));
}
答案 5 :(得分:0)
您可以更有效地使用BigInteger
的现有功能,因为它已经为您完成了所有这些。
public void test() {
System.out.println("Hello");
int i = 1234567;
byte[] ba = BigInteger.valueOf(i).toByteArray();
int j = new BigInteger(ba).intValue();
System.out.println("i="+i+" ba="+Arrays.toString(ba)+" j="+j);
}
打印
i=1234567 ba=[18, -42, -121] j=1234567