我正在使用Java从SNES ROM读取数据。我打开一个流并将字节读入数组:
InputStream stream = open("foo.rom");
final int startingSize = stream.available();
byte[] data = new byte[startingSize];
final int numberRead = stream.read(data, 0, startingSize);
在ROM中,我有这个值:
E4 2B 00 02 03 00 FF 3A 00 83
228 43 0 2 3 0 255 58 0 131(十进制)
然而,我的代码表现得很奇怪。设置一些调试语句后,我使用String.valueOf(data [ref])打印时有这种模式:
-28 43 0 2 3 0 -1 58 0 -125
(ROM中的这个地址是第一个出现数据的地址,但我注意到程序中其他地方的值不正确。)
尽管我可以告诉我的Java字节数组不符合十六进制数据。如何设置我的字节数组呢?
答案 0 :(得分:8)
Java将所有字节视为已签名,因此它们只能在-128到+127范围内。位模式E4
对应于二进制补码中的-28。
您可以通过执行String.valueOf(data[ref] & 0x00FF)
之类的操作将有符号字节转换为pretend-unsigned-ints。这将剥离符号位并自动转换为int。
答案 1 :(得分:2)
尝试使用函数以更熟知的零填充十六进制字符串格式打印出每个字节:
public static String toHexString(byte b) {
return String.format("%02X", b);
}
(是的,我知道有更有效的方法来编写这种方法。)
答案 2 :(得分:1)
它的工作非常好。请注意,byte
是签名类型,因此大于或等于128的值将被解释为256 - value
。