在Java中将十六进制数据读入字节数组?

gjt*_*ian 4 java hex bytearray stream

我正在使用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);
Run Code Online (Sandbox Code Playgroud)

在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字节数组不尊重十六进制数据.如何设置我的字节数组呢?

Cam*_*ner 8

Java将所有字节视为已签名,因此它们只能在-128到+127的范围内.位模式E4对应于二进制补码中的-28.

您可以通过执行类似操作将有符号字节转换为pretend-unsigned-ints String.valueOf(data[ref] & 0x00FF).这将剥离符号位并自动转换为int.