Конвертировать 32-битную двоичную строку в байт - PullRequest
0 голосов
/ 09 октября 2018

Я использую FileInputStream для чтения одного байта за раз, затем я превращаю его в строку, используя Integer.toBinaryString (), и позже мне нужно преобразовать его обратно в байт.

вот мойпроблема: java использует 32-битный байт, это означает, что моя строка, возвращаемая Integer.toBinaryString (), имеет длину 32, и я довольно разочарован, пытаясь преобразовать ее обратно в байт, потому что такие методы, как Byte.valueOf () ии так далее, все выдают ошибку, относящуюся к значению вне диапазона байтов.

Я что-то упустил?Или мне нужно разработать свой собственный метод.

1 Ответ

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

Я нашел простой ответ: |

public class abc
{
    public static void main (String[] args)
    {
        byte b = -1;
        String binString = Integer.toBinaryString(b); //value 1111,1111,1111,1111,1111,1111,1111,1111
        new BigInteger(binString, 2).byteValue(); //value -1 
    }
}

Он усекает binString, но это не влияет на значение байта, потому что 24 бита слева на самом деле не имеют отношения к байту.

Теперь в приведенном выше примере я использую BigInteger и его метод byteValue (), причина этого и то, почему я не просто использую решение 0xff, заключается в том, что Integer.toBinaryString ()в приведенном выше коде будет возвращена строковая цифра (32 1) длиной 32, которая не может быть преобразована в целое или даже длинное, потому что это слишком большое число / значение.В результате этого, не имея возможности привести его к типу int или long, никто не может выполнять такие операции, как &, поэтому решение состоит в том, чтобы обрезать строку из 24 бит слева, после чего можноприведение / преобразование более короткой строки в int, что и делает BigInteger в приведенном выше коде.

Байт все равно будет сохранять свое значение, поскольку значение содержится только в 8 битах справа (остается истиннымк тому, что байт).Добавленные 24 бита, которые Java иногда добавляет к 8-битному байту, предназначены для собственных целей java и могут быть проигнорированы, если это необходимо, например, проблема, которая породила этот поток.

...