Чтение шестнадцатеричных данных в байтовый массив в Java? - PullRequest
4 голосов
/ 09 ноября 2010

Я читаю данные из ПЗУ SNES, используя Java. Я открываю поток и читаю байты в массив:

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

В ПЗУ у меня есть это значение:

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

(Этот адрес в ПЗУ является первым, где появляются данные, но я замечаю неправильные значения в других местах программы.)

Насколько я могу судить, мой байтовый массив Java не учитывает шестнадцатеричные данные. Как я могу установить свой байтовый массив для этого?

Ответы [ 3 ]

8 голосов
/ 09 ноября 2010

Java рассматривает все байты как подписанные, поэтому они могут быть только в диапазоне от -128 до +127. Битовая комбинация E4 соответствует -28 в дополнении до двух.

Вы можете преобразовать подписанные байты в pretend-unsigned-ints, выполнив что-то вроде String.valueOf(data[ref] & 0x00FF). Это удалит знаковый бит и автоматически преобразует в целое число.

2 голосов
/ 09 ноября 2010

Попробуйте использовать функцию для печати каждого байта в более известном формате шестнадцатеричной строки с нулевым дополнением:

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

(Да, я знаю, что есть более эффективные способы написания этого метода.)

1 голос
/ 09 ноября 2010

Работает отлично. Помните, что byte является типом со знаком, поэтому значение, большее или равное 128, интерпретируется как 256 - value.

...