字节数组到*签名* Int

我正在尝试将-101转换为字节数组,然后将字节数组转换回-101 。 我的方法适用于正值,但不适用于负值。 你能说出我做错了什么吗? 而不是-101byteArrayToInt方法返回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

编辑:检查最高位的简单方法是检查高位字节是否为负。