kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 Max
Max
Вопрос

Как лучше всего обойти тот факт, что ВСЕ байты Java подписаны?

В Java не существует такого понятия, как беззнаковый байт.

Работая с низкоуровневым кодом, иногда приходится работать с байтами, которые имеют беззнаковые значения больше 128, что заставляет Java интерпретировать их как отрицательное число из-за того, что MSB используется для знака.

Как это можно обойти? (Сказать "не используйте Java" - не вариант).

58 2008-08-14T14:14:03+00:00 7
Программирование
java
byte
unsigned
signed
 ejack
ejack
21-го августа 2008 в 1:17
2008-08-21T01:17:45+00:00
Дополнительно
Источник
Редактировать
#8414933

На самом деле возможно избавиться от, если заявление и дополнение, если Вы делаете это как это.

byte[] foobar = ..;
int value = (foobar[10] & 0xff);

Таким образом, Ява doesn' t интерпретируют байт как отрицательное число и щелкают знаком, обдумал целое число также.

 gtgaxiola
gtgaxiola
Редактировал ответ 1-го августа 2018 в 4:00
78
0
Решение / Ответ
 pauldoo
pauldoo
14-го августа 2008 в 2:24
2008-08-14T14:24:50+00:00
Дополнительно
Источник
Редактировать
#8414930

При чтении любого отдельного значения из массива скопируйте его во что-то вроде short или int и вручную преобразуйте отрицательное число в положительное, каким оно должно быть.

byte[] foobar = ..;
int value = foobar[10];
if (value < 0) value += 256 // Patch up the 'falsely' negative value

Аналогичное преобразование можно выполнить и при записи в массив.

20
0
 izb
izb
19-го августа 2008 в 8:03
2008-08-19T08:03:27+00:00
Дополнительно
Источник
Редактировать
#8414932

Используя ints обычно лучше, чем использование шорт, потому что Ява использует 32-битные ценности внутренне так или иначе (Даже для байтов, если во множестве), настолько использующий ints избежит ненужного преобразования в короткие ценности в bytecode.

1
0
 martinatime
martinatime
19-го августа 2008 в 3:39
2008-08-19T03:39:43+00:00
Дополнительно
Источник
Редактировать
#8414931

Лучший способ сделать побитовую обработку / неподписанные байты посредством использования интервал s. Даже при том, что они подписаны, у них есть много запасных битов (32 общих количества), чтобы рассматривать как неподписанный байт. Кроме того, все математические операторы преобразуют меньшие фиксированные числа точности в интервал . Пример:

short a = 1s;
short b = 2s;
int c = a + b; // the result is up-converted
short small = (short)c; // must cast to get it back to short

Из-за этого лучше просто придерживаться целого числа и маскировать его, чтобы получить биты, которыми Вы интересуетесь. Пример:

int a = 32;
int b = 128;
int foo = (a + b) | 255;

Вот является еще некоторая информация о Яве примитивными типами http://mindprod.com/jgloss/primitive.html

Одно последнее тривиальное примечание, на Яве есть одно неподписанное фиксированное число точности. Это случайная работа примитивно.

0
0
 stimms
stimms
14-го августа 2008 в 2:22
2008-08-14T14:22:24+00:00
Дополнительно
Источник
Редактировать
#8414929

Вероятно, лучше всего использовать целое число, а не байт. Оно позволяет использовать числа больше 128 без необходимости создавать специальный объект для замены байта.

Это также предложено людьми умнее меня (всеми).

  • http://www.darksleep.com/player/JavaAndUnsignedTypes.html
  • http://www.jguru.com/faq/view.jsp?EID=13647
0
0
 octo
octo
18-го февраля 2011 в 11:33
2011-02-18T23:33:42+00:00
Дополнительно
Источник
Редактировать
#8414934

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

Простое решение:

if((val & (byte)0x80) != 0) { ... }

Если реальная проблема - > 128 вместо этого, просто добавив другое условие к тому если-заявлению добьется цели.

0
0
Nick Berardi
Nick Berardi
14-го августа 2008 в 2:17
2008-08-14T14:17:48+00:00
Дополнительно
Источник
Редактировать
#8414928

Я думаю, что вы можете просто использовать короткое время для их хранения. Не очень эффективно, но это действительно единственный вариант, кроме некоторых геркулесовых усилий, которые я видел.

-1
0
Похожие сообщества 11
pro.jvm
pro.jvm
5 817 пользователей
Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш канал: @proJVM Вакансии: @jvmjobs @jvmjobschat ⚠️ Оффтоп -> @flood ❌Переход на личности ❌Троллинг ❌Реклама ❌HH (вакансии) ❌Варез
Открыть telegram
learn.java
learn.java
5 372 пользователей
Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat
Открыть telegram
Java & Co
Java & Co
4 432 пользователей
Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/179171 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude
Открыть telegram
pro.JVM Jobs Chat
pro.JVM Jobs Chat
2 551 пользователей
Чат для обсуждения вакансий на JVM языках. Правила: - Никакого спама - Никакого троллинга и оскорблений участников - Размещение вакансий только через канал Канал для вакансий: @jvmjobs Основной чат: @jvmchat Наши друзья: @scala_jobs, @scala_jobs_feed
Открыть telegram
Java/Kotlin and more
Java/Kotlin and more
2 063 пользователей
чат о Java/Kotlin и связанных технологиях. We're discussing: job, tech questions etc. languages: russian, java, eng, kotlin Ссылка на чат: t.me/springframeworkio
Открыть telegram
Java Underground
Java Underground
1 751 пользователей
Библиотека по Java https://t.me/javalib Наше сообщество ВК: https://vk.com/javatutorial Вакансии и резюме свои строго в этот канал: https://t.me/job_java
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Денис Васьков
Зарегистрирован 16 часов назад
2
Dima Patrushev
Зарегистрирован 2 дня назад
3
sirojidddin otaboyev
Зарегистрирован 1 неделю назад
4
Елена Гайдамамакинат
Зарегистрирован 1 неделю назад
5
Иван Степанюк
Зарегистрирован 1 неделю назад
ID
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией