我知道 - 在Java-int中是4个字节。但我希望将int转换为n字节数组,其中n可以是1,2,3或4个字节。我想把它作为带符号的字节/字节,所以如果我需要将它们转换回int(事件,如果它是1个字节),我得到相同的signed int。我完全清楚从int转换为3或更低字节时精度损失的可能性。
我设法将int转换为n字节,但将其转换为负数会产生无符号结果。
修改
int to bytes(参数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转换器的字节可能存在问题。
答案 0 :(得分: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)
};
}
答案 1 :(得分:5)
BigInteger.toByteArray()
会为你做这件事......
返回一个包含此
BigInteger
的二进制补码表示的字节数组。字节数组将采用big-endian字节顺序:最重要的字节位于第0个元素中。 数组将包含表示此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
答案 2 :(得分:1)
类似的东西:
int unsignedByte = ((int)bytes[i]) & 0xFF;
int n = 0;
n |= unsignedByte << 24;