Как сложить несколько байтов? - PullRequest
0 голосов
/ 23 октября 2010

Я пытаюсь написать патчер для ROM-файла, и я пришел к этому в документации:

The next three bytes are the place in the destination file
(the file to be patched) where a change is to be made.

The two bytes following that are the length of the amount
of data to be changed.

Как мне правильно превратить эти три и два байта в одно число в java?

Ответы [ 2 ]

2 голосов
/ 23 октября 2010

Странно, я вижу правильный ответ Джои , который он удалил 10 минут назад:

(byte1 << 16) + (byte2 << 8) + byte3

Единственное, что я должен добавить: не преобразовывать байты, которые вы читаете из InputStream, в тип byte (InputStream#read возвращает значение int в диапазоне от 0 до 255). Например, это превратится 255 в -1, и нам не нужен такой побочный эффект.

Итак, это может выглядеть как

(in.read() << 16) + (in.read() << 8) + in.read()
1 голос
/ 23 октября 2010

Убедитесь, что вы используете потомок InputStream (байт против ввода символов).

Самый важный вопрос, который нужно задать, заключается в том, хранятся ли данные в порядке «little-endian» или «big-endian». Я предполагаю, что в порядке байтов (x86). Для трехбайтового числа:

FileInputStream fs = new FileInputStream(...);

int byte1 = fs.read();
int byte2 = fs.read();
int byte3 = fs.read();
int data = (byte3 << 16) | (byte2 << 8) | byte1;

Для байтов с прямым порядком байтов первое чтение байта является наименее значимым байтом.

Если вам нужен big-endian, измените последнюю строку на:

int data = (byte1 << 16) | (byte2 << 8) | byte3;
...