2012-08-16 90 views
1

我試圖將-101轉換爲字節數組,然後將字節數組轉換回-101。下面我的方法適用於正值,但不適用於負值。你能提出我做錯了什麼嗎?而不是-101byteArrayToInt方法返回65435。謝謝!字節數組* *簽名* Int

/** 
* Converts a <code>byte</code> array to a 32-bit <code>int</code>. 
* 
* @param array The <code>byte</code> array to convert. 
* @return The 32-bit <code>int</code> 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 <code>int</code> to a <code>byte</code> array. 
* 
* @param value The 32-bit <code>int</code> to convert. 
* @return The <code>byte</code> array. 
*/ 
public static byte[] intToByteArray(int value, int size) { 
    byte[] bytes = new byte[size]; 
    for (int index = 0; index < bytes.length; index++) { 
    bytes[index] = (byte) (value >>> (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 
} 

回答

3

您需要簽名擴展您的電話號碼。如果您還沒有,請閱讀two's complement表示符號的二進制數字。

作爲32位整數的數字-101是十六進制的0xFFFFFF9B。您將其轉換爲2個字節的字節數組。那隻剩下0xFF9B。現在,當您將其轉換回來時,將其轉換爲32位整數,結果爲十進制的0x0000FF9B65435

您應該檢查您的字節數組中的最高位,並根據該位進行符號擴展。如果設置了最高位,最簡單的方法是從value=-1開始,如果不是,則默認爲value=0

編輯:一個簡單的方法來檢查最高位是檢查高位字節爲負。