2014-04-24 58 views
0

我有很長的價值,我想轉換ot字節數組。我用這個功能無法將字節轉換爲普通視圖

 public static byte[] longToByteArray(long value) { 
     byte[] result = new byte[8]; 
     for(int i = 0; i < 8; i++) { 
      result[i] = (byte)(value & 0xFF); 
      System.out.println(result[i]); 
      System.out.println(Integer.toBinaryString(result[i])); 
      value >>>= 8; 
     } 
     return result; 
     } 

和輸出數據看起來像

18 
10010 
-12 
11111111111111111111111111110100 
88 
1011000 
83 
1010011 
0 
0 
0 
0 
0 
0 
0 
0 

爲什麼我在-12二進制視圖太多1,我怎樣才能得到它像

11110100 

回答

0

這是因爲Integer.toBinaryString(result[i])將您的字節轉換爲int(32位),並且字節也從-128到127表示,所以值大於127的值表示爲負數;因此,你的字節最終是一個負int。要解決它,你可以改變這一行:

System.out.println(Integer.toBinaryString(result[i])); 

這一個:

System.out.println(Integer.toBinaryString(result[i] & 0xFF)); 
+0

-12是一個負整數。我認爲你的意思是'System.out.println(Integer.toBinaryString(result [i]&0xFF));'(單個'&') –

+0

@EvanKnowles確定它是,有什麼要澄清的嗎? – morgano

+0

@EvanKnowles你是對的,它是'&',而不是'&&',我要刪除我的答案,你可以請添加行到你的答案? OP還要求解決方案 – morgano

0

你的-12現在是11111111111111111111111111110100,因爲它是一個負數,以2的補碼格式編碼,使用所有32位可用,因爲它被解析爲一個整數。

如果你只想要最後的8位,你可能必須像這樣格式化它。檢查這個答案:How to convert a byte to its binary string representation

0

的原因是,即使你做(byte)(value & 0xFF)當你調用Integer.toBinaryString它被轉換回32位整數你得到正確的輸出-12整數。

一個簡單的解決方案是將負字節值(-128到-1)轉換爲正無符號字節值(128到255)。這簡直是​​通過測試陰性和添加256,像這樣完成:

int b = (int)(value & 0xFF); 
if (b<0) { 
    b = b + 256; 
} 

這在一個整數數據類型來完成的,但所得到的值是0..255這適於一個無符號字節。所以現在,事實證明,代替-12,您將擁有244,但事實證明,244的二進制表示與-12的8位版本相同。試試看!

0

可以使用JBBP

byte [] packed = JBBPOut.BeginBin().Long(aLongValue).End().toByteArray();