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

5

我正在使用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字节数组没有遵守十六进制数据。我该如何设置我的字节数组来遵守十六进制数据?

Javadoc中有明确的警告,禁止以你在此处使用available()的方式使用它。 - user207421
3个回答

7

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

你可以通过执行类似于String.valueOf(data[ref] & 0x00FF)的操作将有符号字节转换为假的无符号整数。 这将剥离掉符号位并自动转换为int型。


那么我该怎么办呢?将“byte”的引用替换为“int”,转换数据,然后希望一切顺利吗? - user213345
不,只是进行调试时进行转换。你可能希望保留原始数据作为代码的其余部分。 - Cameron Skinner

2
尝试使用一个函数以更为常见的零填充十六进制字符串格式打印出每个字节:
public static String toHexString(byte b) {
    return String.format("%02X", b);
}

(是的,我知道有更有效的方法来编写此方法。)


1

它完美地工作着。请记住,byte是一种有符号类型,因此大于或等于128的值被解释为256-value


不是这样的。它被解释为“值-256”。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接