Преобразование Java из подписанного в беззнаковое в одном байте

У меня есть byte b, который в Java представляет целые числа со знаком от -128 до +127. Как преобразовать его для представления только (положительных) целых чисел без знака? Я не хочу использовать int или long, но 1-байтовое представление и просто сдвигаю биты в b


person raff5184    schedule 13.12.2019    source источник
comment
В Java нет беззнаковых примитивов. Что вы пытаетесь решить? (Честно говоря, вы можете использовать для этого short...)   -  person Makoto    schedule 13.12.2019
comment
Я выполняю некоторые операции с этим байтом, а затем отправляю байт в другие фрагменты кода на других языках (Python, C..), поэтому я не могу изменить количество битов. Кроме того, из-за некоторых операций, которые я выполняю, у меня не может быть отрицательных целых чисел. Поэтому мне в основном нужна маска или функция, которая принимает число от -128 до 127 и преобразует его в положительное. Я мог бы использовать int или long, но в конечном итоге мне нужно обрезать его до байта.   -  person raff5184    schedule 13.12.2019
comment
Если вы просто отправляете байт, то это 8 бит. Ответственность за передачу правильного байтового представления или правильного числа лежит на приложении Java? В C вы можете получить байты без знака, а в Python вы всегда можете применить маску 0xFF к числу, чтобы получить то, что определенно не будет байтом.   -  person Makoto    schedule 13.12.2019
comment
Вы отправляете значение другим частям кода. А вот знак определяется ХОБ. Так разве это не зависит от того, как другие языки интерпретируют группу из 8 бит. В Java, если знак установлен, он отрицательный. Кроме того, истинные значения без знака отличаются не только тем, как они выглядят, но и тем, как они сравниваются.   -  person WJS    schedule 13.12.2019
comment
По сути, я отправляю код CRC длиной 1 байт; и поэтому приложение Java отвечает за отправку правильной последовательности битов и не должно добавлять больше битов (что произойдет, если я отправлю int). Более того, в Java мне нужно выполнить некоторые операции с этим байтом, как если бы я мог интерпретировать его как беззнаковое (0-255, как и в других языках), но в конечном итоге все еще иметь 8-битное представление. Например: byte b = -120; // Беззнаковые операции. -120 должно быть +8 send();   -  person raff5184    schedule 13.12.2019
comment
Я все еще не совсем понимаю, почему вы не можете просто выполнить математику в int, а затем отправить младший байт. Если бы вы делали это только в 8-битном пространстве, вы также потеряли бы те же биты, которые вы маскируете от int. Я делал линейные контрольные суммы и последовательности проверки кадров для различных проектов, и у меня никогда не было проблем с использованием подписанных типов. Можете ли вы привести конкретный пример, когда математика влияет на одно и другое.   -  person WJS    schedule 13.12.2019
comment
Конечно. Я вычисляю CRC и получаю отрицательное целое число. Я добавляю CRC к сообщению, а затем запускаю стандартный алгоритм кодирования Рида-Соломона. Операции должны выполняться в двоичном поле, поэтому мое отрицательное число вызывает исключение, поскольку поле принимает числа от 0 до 255.   -  person raff5184    schedule 14.12.2019