Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Прочитать 4 байта как unsigned в long  [new]
mr_virtus
Member

Откуда:
Сообщений: 865
Хочется прочитать из массива байт 4 байта как безнаковое число.
29 апр 19, 14:29    [21874374]     Ответить | Цитировать Сообщить модератору
 Re: Прочитать 4 байта как unsigned в long  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7607
long не бывает безнаковым

А так, см. ф-ции в соответсвующих классах. Ну и не понятно, что Вы имеете в виду под "массив байт 4 байта" (какой порядок следования байтов и так далее). Можно читать по байтно и потом комбинировать сдвигами и OR. Можно просто не проверяя тип скастовать. Например https://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html имеет методы кастовать данные практически в любой тип.

IMHO & AFAIK
29 апр 19, 15:45    [21874535]     Ответить | Цитировать Сообщить модератору
 Re: Прочитать 4 байта как unsigned в long  [new]
mr_virtus
Member

Откуда:
Сообщений: 865
Leonid Kudryavtsev,

автор
long не бывает безнаковым


имеется в виду сохранить 4 байтовое безнаковое в long.

автор
какой порядок следования байтов и так далее


От старшего к младшему.

автор
Можно читать по байтно и потом комбинировать сдвигами и OR


Это и нужно, битовыми операциями. Не получилось нагуглить, думал может кто подскажет точно как правильно делается.
29 апр 19, 17:18    [21874658]     Ответить | Цитировать Сообщить модератору
 Re: Прочитать 4 байта как unsigned в long  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7607
mr_virtus
Это и нужно, битовыми операциями. Не получилось нагуглить, думал может кто подскажет точно как правильно делается.

А что там гуглить? Это в школе на уроке информатики в 7-м классе проходят.

Не думал, не проверял. возможно дичь:

byte b1, b2, b3, b4;
long res;
res := (long)(b1 << 24) | (long)(b2 <<16) | (long)(b3 << 8) | (long)b4;
29 апр 19, 17:26    [21874668]     Ответить | Цитировать Сообщить модератору
 Re: Прочитать 4 байта как unsigned в long  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 9133
mr_virtus
имеется в виду сохранить 4 байтовое безнаковое в long.
В дополнительной кодировке старший бит не имеет сакрального смысла - (без)знаковость проявляется в конкретных операциях.
API для беззнаковых чисел есть в Java8.
mr_virtus
Это и нужно, битовыми операциями. Не получилось нагуглить, думал может кто подскажет точно как правильно делается.
Как уже говорили: ByteBuffer - там и чтение/запись и установка порядка байт.
29 апр 19, 17:27    [21874669]     Ответить | Цитировать Сообщить модератору
 Re: Прочитать 4 байта как unsigned в long  [new]
mr_virtus
Member

Откуда:
Сообщений: 865
Leonid Kudryavtsev,

автор
Не думал, не проверял. возможно дичь:
byte b1, b2, b3, b4;
long res;
res := (long)(b1 << 24) | (long)(b2 <<16) | (long)(b3 << 8) | (long)b4;


В ByteBuffer подглядел -

автор
static private long makeLong(byte b7, byte b6, byte b5, byte b4,
byte b3, byte b2, byte b1, byte b0)
{
return ((((long)b7 ) << 56) |
(((long)b6 & 0xff) << 48) |
(((long)b5 & 0xff) << 40) |
(((long)b4 & 0xff) << 32) |
(((long)b3 & 0xff) << 24) |
(((long)b2 & 0xff) << 16) |
(((long)b1 & 0xff) << 8) |
(((long)b0 & 0xff) ));


Осталось убедиться, что ваш вариант рабочий) Спасибо.
29 апр 19, 17:34    [21874674]     Ответить | Цитировать Сообщить модератору
 Re: Прочитать 4 байта как unsigned в long  [new]
mr_virtus
Member

Откуда:
Сообщений: 865
Basil A. Sidorov,

Спасибо.
29 апр 19, 17:36    [21874676]     Ответить | Цитировать Сообщить модератору
 Re: Прочитать 4 байта как unsigned в long  [new]
mr_virtus
Member

Откуда:
Сообщений: 865
mr_virtus,

автор
В ByteBuffer подглядел -


Точнее этот метод взял из Bits.
29 апр 19, 17:39    [21874681]     Ответить | Цитировать Сообщить модератору
 Re: Прочитать 4 байта как unsigned в long  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7607
Слона. что 4 байта это int, а не long, я даже и не подумал/не заметил )))
29 апр 19, 17:47    [21874691]     Ответить | Цитировать Сообщить модератору
 Re: Прочитать 4 байта как unsigned в long  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7607
Ну и да, так просто кастовать безнаковые к большему типу нульзя ((( знаковый бит размножаться будет (поэтому его потом через AND зачищают)
29 апр 19, 18:12    [21874721]     Ответить | Цитировать Сообщить модератору
 Re: Прочитать 4 байта как unsigned в long  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 9133
Basil A. Sidorov
В дополнительномй кодеировке
Зачеркнул и подчеркнул.
29 апр 19, 18:28    [21874744]     Ответить | Цитировать Сообщить модератору
 Re: Прочитать 4 байта как unsigned в long  [new]
mr_virtus
Member

Откуда:
Сообщений: 865
Leonid Kudryavtsev,

автор
Ну и да, так просто кастовать безнаковые к большему типу нульзя ((( знаковый бит размножаться будет (поэтому его потом через AND зачищают)


Ну да.

long var = (((long)b3 & 0xff) << 24) | (((long)b2 & 0xff) << 16) | (((long)b1 & 0xff) << 8) | (((long)b0 & 0xff) ));

Осталось понять, нет ли здесь подвоха)
29 апр 19, 18:31    [21874749]     Ответить | Цитировать Сообщить модератору
 Re: Прочитать 4 байта как unsigned в long  [new]
mr_virtus
Member

Откуда:
Сообщений: 865
автор
В дополнительной кодировке старший бит не имеет сакрального смысла - (без)знаковость проявляется в конкретных операциях.


Я честно говоря не очень понял(мне нужно 4 байта в long преобразовать как unsigned с точки зрения, что в int большое число может не влезть(как раз из-за того что под знак часть места отводится в int))

Сорян, если туплю. Надо будет почитать про дополнительный код.
29 апр 19, 18:34    [21874753]     Ответить | Цитировать Сообщить модератору
 Re: Прочитать 4 байта как unsigned в long  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 9133
mr_virtus
Я честно говоря не очень понял(мне нужно 4 байта в long преобразовать как unsigned с точки зрения, что в int большое число может не влезть(как раз из-за того что под знак часть места отводится в int))
Четыре байта это int. Если вы хотите преобразовать его в long как unsigned int, то возможно (ненужное) расширение знака.
Расширение знака "тривиально обнуляется" или битовой маской или двумя сдвигами.
29 апр 19, 18:59    [21874766]     Ответить | Цитировать Сообщить модератору
 Re: Прочитать 4 байта как unsigned в long  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 9133
И, как обычно, до начала велосипедостроительных работ полезно заглянуть в документацию.
29 апр 19, 19:07    [21874773]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить