Как я могу искать шаблоны в первых 3 битах целого числа, которое назначается из FileInputStream.read (), который возвращает целое число между 0: 255 или -1? - PullRequest
0 голосов
/ 06 октября 2018

Я читаю байты следующим образом:

        try(FileInputStream f = new FileInputStream("nameOfFile")){
            int readByte = 0;
            int mask =0b111;
            while((readByte=f.read())!=-1) {
                System.out.println(Integer.toBinaryString(readByte & mask));
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

Однако, когда я пытаюсь получить 8 бит, которые образуют число, иногда я получаю 7 бит или даже больше бит, чем 8. Может кто-нибудь помочь мнес этой проблемой?Я хочу получить 8 бит, так что после этого я могу посмотреть на первые 3 бита, например.Мне нужно это для возврата кодировки этим методом.

Буду очень признателен, если вы мне поможете.Я с нетерпением жду вашего ответа.

С уважением, WaterKnight

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

A byte - это 8-битное число со знаком с двумя дополнительными знаками.

Если вы считаете, что байт имеет значения 0..255, то вы ошибаетесь.8 битов -128..127, потому что бит 7 является знаковым битом.

Когда вы выполняете битовую манипуляцию с использованием таких операторов, как >>>, byte сначала расширяется до int,это означает, что применяется расширение знака.

Итак, значение без знака 199 (пример) - это биты 11000111, которые в качестве byte являются значением -57 aka 0xC7, и когдазнак, расширенный до int, становится -57 aka 0xFFFFFFC7.

Когда вы сдвигаете вправо на 5 (>>> 5), вы получаете 0x07FFFFFE aka 134217726.

Поскольку вас интересуют только самые младшие 3 бита этого значения, вам нужно замаскировать его: (val >>> 5) & 0x07, что даст вам то, что вы ищете: 0x06 aka 0b110

0 голосов
/ 06 октября 2018

[0, 255] диапазон означает, что вы используете все 8 битов для значения, не оставляя старшего значащего бита для знака.

FileInputStream.read() читает байт данных,Тип возврата int позволяет определить разницу между данными -1 и -1, используемыми для сигнализации о завершении потока.На практике read() возвращаемое значение не будет больше 255.

Если вы хотите посмотреть последние 3 бита, используйте битовую маску.Вы можете использовать двоичный литерал для определения вашей маски:

int mask = 0b111;
int lastBits = readBytes & mask;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...