简体   繁体   中英

Reading hexadecimal data into byte array in Java?

I'm reading data from an SNES ROM using Java. I am opening a stream and reading in the bytes into an array:

InputStream stream = open("foo.rom");
final int startingSize = stream.available();
byte[] data = new byte[startingSize];
final int numberRead = stream.read(data, 0, startingSize);

In the ROM, I have this value:

E4 2B 00 02 03 00 FF 3A 00 83

228 43 0 2 3 0 255 58 0 131 (in decimal)

However, my code is behaving weirdly. After setting up some debug statements, I have this pattern when printing with String.valueOf(data[ref]):

-28 43 0 2 3 0 -1 58 0 -125

(This address in the ROM is the first where data appears, but I am noticing incorrect values elsewhere in the program.)

As near as I can tell my Java byte array is not respecting the hexadecimal data. How can I set my byte array to do so?

Java treats all bytes as being signed, so they can only be in the range -128 to +127. The bit pattern E4 corresponds to -28 in two's complement.

You can convert signed bytes to pretend-unsigned-ints by doing something like String.valueOf(data[ref] & 0x00FF) . That will strip off the sign bit and auto-convert to an int.

Try using a function to print out each byte in the more well-known zero-padded hex string format:

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

(Yes I know there are more efficient ways to write this method.)

It's working perfectly fine. Keep in mind that byte is a signed type, so a value greater or equal than 128 is interpreted as 256 - value .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM