2010-11-09 68 views
4

我正在使用Java從SNES ROM讀取數據。我打開流和讀取中的字節到一個數組:在Java中將十六進制數據讀入字節數組?

InputStream stream = open("foo.rom"); 
final int startingSize = stream.available(); 
byte[] data = new byte[startingSize]; 
final int numberRead = stream.read(data, 0, startingSize); 

在ROM,I具有此值:

E4 2B 00 02 03 00 FF 3A 00 83

228 43 0 2 3 0 255 58 0 131(十進制)

但是,我的代碼行爲異常。設置一些調試語句後,我有這種圖案與將String.valueOf打印時(數據[參考]):

-28 43 0 2 3 0 -1 0 58 -125

(此地址在ROM中是第一個出現數據的地方,但我注意到程序中其他地方的值不正確。)

就在我可以告訴我的Java字節數組並不尊重十六進制數據。我怎樣才能設置我的字節數組呢?

+0

Javadoc中有一個特定的警告,就是在這裏使用'available()'的方式。 – EJP 2017-10-12 09:16:58

回答

8

Java將所有字節視爲簽名,因此它們只能在-128到+127的範圍內。位模式E4對應於二進制補碼中的-28。

通過執行諸如String.valueOf(data[ref] & 0x00FF)之類的操作,可以將帶符號的字節轉換爲假冒未簽名的字節。這將剝離符號位並自動轉換爲int。

+0

但是我該怎麼辦?將「字節」的引用替換爲「int」,轉換數據,並希望最好? – GJTorikian 2010-11-09 04:33:24

+0

不,只做轉換調試。您可能希望保留原始數據,因爲它是其餘代碼的原始數據。 – 2010-11-09 11:37:20

1

它工作得很好。請記住,byte是一種帶符號的類型,因此大於或等於128的值將被解釋爲256 - value

+0

不,不是。它被解釋爲「value-256」。 – EJP 2017-10-12 09:18:04

1

嘗試使用功能,在較爲知名的零填充的十六進制字符串格式打印出的每個字節:(是的,我知道有寫這個方法更有效的方法)

public static String toHexString(byte b) { 
    return String.format("%02X", b); 
} 

相關問題