【问题标题】:Reading hexadecimal data into byte array in Java?在Java中将十六进制数据读入字节数组?
【发布时间】:2011-05-07 00:02:46
【问题描述】:

我正在使用 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() 的方式与您在此处使用的方式完全相同。

标签: java stream bytearray hex


【解决方案1】:

尝试使用函数以更广为人知的零填充十六进制字符串格式打印出每个字节:

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

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

【讨论】:

    【解决方案2】:

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

    您可以通过String.valueOf(data[ref] & 0x00FF) 之类的操作将有符号字节转换为假无符号整数。这将去掉符号位并自动转换为 int。

    【讨论】:

    • 但是我该怎么办呢?将“byte”的引用替换为“int”,转换数据,希望最好?
    • 不,只做调试用的转换。您可能希望为其余代码保留原始数据。
    【解决方案3】:

    它工作得很好。请记住,byte 是有符号类型,因此大于或等于 128 的值将被解释为 256 - value

    【讨论】:

    • 不,不是。它被解释为value-256
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 2020-01-24
    • 2013-04-07
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    相关资源
    最近更新 更多