6

我知道 - 在 Java 中 - int 是 4 个字节。但我希望将 int 转换为 n 字节数组,其中 n 可以是 1、2、3 或 4 个字节。我想将它作为带符号的字节/字节,这样如果我需要将它们转换回 int(如果它是 1 个字节,则事件),我会得到相同的带符号的 int。我完全意识到从 int 转换为 3 或更低字节时精度损失的可能性。

我设法从 int 转换为 n 字节,但将其转换回负数会产生无符号结果。

编辑:

int 到字节(参数 n 指定所需的字节数 1、2、3 或 4,而不管可能的进动损失)

public static byte[] intToBytes(int x, int n) {
    byte[] bytes = new byte[n];
    for (int i = 0; i < n; i++, x >>>= 8)
        bytes[i] = (byte) (x & 0xFF);
    return bytes;
}

字节到 int(不管 1、2、3 或 4 有多少字节)

public static int bytesToInt(byte[] x) {
    int value = 0;
    for(int i = 0; i < x.length; i++)
        value += ((long) x[i] & 0xffL) << (8 * i);
    return value;
}

字节到 int 转换器可能存在问题。

4

3 回答 3

6

无论如何,这是我放在一起的代码:

public static void main(String[] args) throws Exception {
  final byte[] bi = encode(-1);
  System.out.println(Arrays.toString(bi));
  System.out.println(decode(bi));
}
private static int decode(byte[] bi) {
  return bi[3] & 0xFF | (bi[2] & 0xFF) << 8 |
         (bi[1] & 0xFF) << 16 | (bi[0] & 0xFF) << 24;
}
private static byte[] encode(int i) {
  return new byte[] { (byte) (i >>> 24), (byte) ((i << 8) >>> 24),
                      (byte) ((i << 16) >>> 24), (byte) ((i << 24) >>> 24)
  };
}
于 2012-07-10T21:20:20.653 回答
6

BigInteger.toByteArray()会为你做这...

返回包含 this 的二进制补码表示的字节数组BigInteger。字节数组将采用大端字节序:最高有效字节位于第零个元素中。该数组将包含表示它所需的最小字节数,BigInteger,包括至少一个符号位,即(ceil((this.bitLength() + 1)/8)). (此表示与(byte[])构造函数兼容。)

示例代码:

final BigInteger bi = BigInteger.valueOf(256);
final byte[] bytes = bi.toByteArray();

System.out.println(Arrays.toString(bytes));

印刷:

[1, 0]

要从字节数组返回 int,请使用BigInteger(byte[])构造函数:

final int i = new BigInteger(bytes).intValue();
System.out.println(i);

打印预期的:

256
于 2012-07-10T21:34:19.500 回答
1

就像是:

int unsignedByte = ((int)bytes[i]) & 0xFF;

int n = 0;
n |= unsignedByte << 24;
于 2012-07-10T21:19:46.617 回答