1

我有 2 种方法,其中一种将整数转换为字节数组,另一种将字节数组转换为整数。但是当我定义字节数组的长度小于 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));

}

}

谢谢

4

6 回答 6

1

Anint为 4 个字节。来自 javadocByteBuffer.putInt()

以当前字节顺序将包含给定 int 值的四个字节写入此缓冲区的当前位置,然后将该位置增加四。

并抛出:

BufferOverflowException - 如果此缓冲区中剩余的字节数少于四个

于 2013-10-21T12:37:11.630 回答
1

您很可能试图将 32 位(4 字节)int值写入 3 字节数组。您getIntegerFromByte需要一个至少 4 个字节的数组。

尝试

byte[] b = app.getByteArrayFromInteger(1, 4);
于 2013-10-21T12:38:27.653 回答
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
于 2013-10-21T13:48:46.450 回答
0

这是因为对于转换,您使用的是长度为 4 的字节数组,如果您给出较小的大小,它将给出与越界相关的异常......

于 2013-10-21T12:40:11.883 回答
0

试试这样:-

byte [] b = app.getByteArrayFromInteger(0, 3);
于 2013-10-21T12:42:02.407 回答
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));

}
于 2013-10-21T13:16:20.120 回答