2016-05-19 4 views
1

Я не знаю, является ли это ошибкой или что-то мне не хватает здесь. Я пытаюсь получить точные байты файла, чтобы я мог работать над некоторыми.Java FileInputStream помещает 3-4 байта в один и тот же индекс байтового массива?

Так что я Byte [1024] массив, чтобы получить первые 1024 байт из него, полукокса [1024] массив, и я делаю в Integer.toBinaryString на каждый байт, чтобы увидеть его значение

Но некоторые позиции, вместо 8-битового байта, есть значения, такие как индекс [20] = 11111111111111111111111111111111 индекса [21] = 11111111111111111111111111111110

Как может быть байт 32 бит?

В этом случае он должен быть UTF-16 BOM и в соответствии с моим испытанием должно быть 255 254, так что только последние 8 каждого индекса должен быть там

Заранее спасибо за помощь

ответ

2

Оба байта и ints подписаны на Java.

Отрицательные значения сохраняются как дополнения к двум.

Таким образом, -1 байт представлен как «1111 1111». Он преобразуется в -1 int, который представлен как «1111 1111 1111 1111 1111 1111 1111 1111», что и есть то, что вы видите.

Если у вас есть байт b и вы хотите увидеть его точное побитовое представление, вам нужно сделать ((int) b) & 0xFF.

Это преобразует ваш байт в int и сбросит все биты «выше» первого байта этого нового int до нуля.

+0

спасибо за объяснение, моя программа сейчас работает – dac1n

1

Вы звоните Integer.toBinaryString(), который принимает параметр int.

byte Вы сдаете автоматически присваивается int. int имеет 4 байта, поэтому вы получаете 32 бита, которые видите.

+0

Остальные байты напечатаны ok.But в любом случае, есть ли другой метод, где я могу просто скопировать байт в виде строки? Я хочу напечатать фактический байт в файле, например «00000101 в позиции i», а не расшифровать его ни на что другое. – dac1n

+1

[Этот ответ] (http://stackoverflow.com/a/12310078/3558960) представляет собой решение. –

+0

& 0xFF, похоже, работает. Однако, чтобы быть уверенным, что если я делаю только println (byte [i]), а консоль отображает целое число, все равно предполагается, что это целое число со знаком, как моя ошибка выше? Я просто хочу убедиться, что byte & 0xFF - это точно содержимое файла – dac1n