2012-12-13 42 views
1

我在java.I中新建一個帶有十六進制值的文本文檔,我試圖讀取它並將其轉換爲字節數組。但對於十六進制值等8,d,11,0,解析即時得到錯誤的值對於E4爲-28代替228 如何可以克服該轉換錯誤時E4 ....將十六進制轉換爲java中的字節

  FileInputStream fstream = new FileInputStream("C:/Users/data.txt"); 

      DataInputStream in = new DataInputStream(fstream); 
      BufferedReader br = new BufferedReader(newInputStreamReader(in,"UTF-8")); 


      byte[] bytes = new byte[1024]; 
      String str; 
      int i=0; 

      while ((str = br.readLine()) != null) 
      { 

       bytes[i]= (byte) (Integer.parseInt(str,16) & 0xFF); 
       i++; 

      } 
      byte[] destination = new byte[i]; 
      System.arraycopy(bytes, 0, destination, 0, i); 

      br.close(); 
      return destination; 
+1

Java中的字節已簽名。它的範圍是 - '[-128,127]','127'後面的值是負值。因此'228'是'-28'。 –

+0

請不要使用DataInputStream來閱讀文本http://vanillajava.blogspot.co.uk/2012/08/java-memes-which-refuse-to-die.html –

回答

1

正如Alnitakbyte在Java中籤。 0xe4價值= 228這是無符號,以及byte範圍爲-128到127

我的建議是使用int,而不是像byte

int[] bytes = new int[1024]; 
bytes[i]= Integer.parseInt(str,16); 

你得到你需要有同樣的事情。

+0

很可能他有一個很好的理由需要一個字節數組(即輸入到其他API調用)。轉換爲無符號整數的唯一真正原因是_presentation purpose_,它應該與內部表示分離。 – Alnitak

+1

也注意到,存儲爲'int'將需要比存儲在'byte'數組中多四倍的內存... – Alnitak

+0

@Alnitak是的,你是對的... –

5

字節(和所有其他整數類型)均爲,簽名爲,而不是,未簽名爲

如果你只是將字節視爲一個字節數組,它的一些值是負數並不重要,它們的位表示仍然是正確的。

您可以通過屏蔽與所述int0xff字節值獲得「正確」無符號的價值,儘管所得到的值itselt將是一個int太:

int n = (myByte & 0xff); 
+0

+1但即使你正在將它們視爲位,而不僅僅是調試。爲什麼哦爲什麼java已經簽名...我不買解釋:P – Esailija

相關問題