将整数转换为字节数组,将字节数组转换为整数

时间:2013-10-21 12:32:13

标签: java arrays int bytearray

我有两种方法,其中一种方法将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));

}

}

由于

6 个答案:

答案 0 :(得分:1)

int是4个字节。来自ByteBuffer.putInt()

的javadoc
  

在当前字节中写入包含给定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