2010-11-09 125 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); 
}