Как правильно прочитать байт из файла, используя Java RandomAccessFile? - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть двоичный файл с байтом 88 (который является десятичным числом 136).

Я использую класс RandomAccessFile Java и метод "read" для чтения этого байта через предварительный определенный буфер. Я также попытался "readUnsignedByte ()", но получил ту же проблему, что и ниже.

RandomAccessFile randomAccessFile = new RandomAccessFile(inputFile, "r");
byte[] headerBuffer = new byte[32];
randomAccessFile.read(headerBuffer);

Приведенный выше код дает мне -120 для 88, а не 136.

Я понимаю, что высокий бит порядка или что-то еще установлено, но мне все еще нужно иметь возможность прочитать файл и получить 88 или 136.

Проблема в том, что этот байт является смещением в двоичном файле, где я могу найти первый запись, поэтому отрицательное число не будет работать.

Буду признателен за предложения.

Спасибо,

Ответы [ 4 ]

1 голос
/ 07 апреля 2020

Вы можете использовать метод Byte.toUnsignedInt для преобразования byte в int "без знака".

jshell> byte b = (byte) 0x88;
b ==> -120
jshell> Byte.toUnsignedInt(b);
$57 ==> 136

Операция такая же, как b & 0xff, но не ' t вызвать магические c числа или знания о побитовых операторах.

1 голос
/ 07 апреля 2020

Просто сделайте b & 0xFF, чтобы преобразовать его в натуральное число.

0 голосов
/ 07 апреля 2020

Спасибо всем за ОТЛИЧНЫЕ ответы !!!!

Проблема решена.

0 голосов
/ 07 апреля 2020

Проблема с массовым чтением

Метод read(byte[]), который вы используете для одновременного чтения нескольких байтов, фактически читает байт со знаком , как в readByte(). Таким образом, вы правы, первый бит представляет знак и, таким образом, будет интерпретироваться как Java, потенциально приводящий к отрицательному числу.

Используйте смещение и читать без знака

Преимущество произвольного доступа заключается в переходе к позиции / смещению в файле с использованием seek(long). Итак, если вам известна точная позиция этого указателя записи байта, вы можете перейти туда и продолжить чтение нужного байта как беззнакового , используя readUnsignedByte().

См. Также

Как прочитать файл как байты без знака в Java?

...