字节数组到*签名* Int
我正在尝试将-101
转换为字节数组,然后将字节数组转换回-101
。 我的方法适用于正值,但不适用于负值。 你能说出我做错了什么吗? 而不是-101
, byteArrayToInt
方法返回65435
。 谢谢!
/** * Converts a byte
array to a 32-bit int
. * * @param array The byte
array to convert. * @return The 32-bit int
value. */ public static int byteArrayToInt(byte[] array) { ValidationUtils.checkNull(array); int value = 0; for (int i = 0; i < array.length; i++) { int shift = (array.length - 1 - i) * 8; value = value | (array[i] & 0xFF) << shift; } return value; } /** * Converts a 32-bit int
to a byte
array. * * @param value The 32-bit int
to convert. * @return The byte
array. */ public static byte[] intToByteArray(int value, int size) { byte[] bytes = new byte[size]; for (int index = 0; index >> (8 * (size - index - 1))); } return bytes; } /** * Tests the utility methods in this class. * * @param args None. */ public static void main(String... args) { System.out.println(byteArrayToInt(intToByteArray(32, 2)) == 32); // true System.out.println(byteArrayToInt(intToByteArray(64, 4)) == 64); // true System.out.println(byteArrayToInt(intToByteArray(-101, 2)) == -101); // false System.out.println(byteArrayToInt(intToByteArray(-101, 4)) == -101); // true }
您需要签名扩展您的号码。 如果您还没有,那么您应该阅读已签名二进制数的二进制补码表示。
作为32位整数的数字-101
是hex的0xFFFFFF9B
。 您将其转换为2个字节的字节数组。 0xFF9B
。 现在,当您将其转换回来时,将其转换为32位整数,结果为0x0000FF9B
,或十进制为0x0000FF9B
。
您应该检查字节数组中的最高位,并根据该位进行符号扩展。 一个简单的方法是,如果设置了最高位,则以value=-1
开始,如果不是,则默认为value=0
。
编辑:检查最高位的简单方法是检查高位字节是否为负。