#java #битовые_операции
Что происходит в данной строке? ((in.read() & 0xFF) << 8 | (in.read() & 0xFF)) // В первый in.read() поступает 78, во-второй 132 Насколько я понимаю, смещение, но можно по-подробнее? Ну или же где про это почитать?
Ответы
Ответ 1
Происходит чтение чего-то - A= 0x......ab (байты A, количество разрядов зависит от определения функции in.read()) Выделяется младший байт A и смещается влево (во второй байт) 0x00ab00 Происходит новое чтение C= 0x......cd (байты C) Выделяется младший байт C и объединяется c предыдущим результатом. Получается 0x00abcd Это целочисленное значение, младшее слово которого содержит оба результата чтения. Для приведённого примера чтения 78 и 132 получится 20100 (78*256+132)Ответ 2
В данной строке из потока считывается двухбайтовое число, представленное в формате big endian («старшим байтом вперёд»). Дело в том, что многобайтовые числа можно представить двумя способами: Старшим байтом вперёд (big endian, он же сетевой порядок байтов). При нём 0xabcd хранится как AB CD. Этот способ традиционно используют при передаче данных через интернет. Младшим байтом вперёд (little endian, он же Intel-овский порядок байтов). При нём 0xabcd хранится уже как CD AB. Этот способ является родным для большого количества процессоров (включая x86-совместимые, один из которых находится в вашем компьютере). Расположение числа в памяти при различных порядках байтов. Источник: Википедия, #1 , #2 Могу предположить, что in — это сокет, и используемый вами прикладной протокол предписывает использовать big-endian. Как результат, при чтении многобайтных чисел напрямую получится мусор из-за несовпадения используемого и родного порядков байт. Соответственно, необходимо выполнить преобразование одним из двух способов: Прочитать число целиком и переставить байты на месте; Прочитать число побайтово, сразу же размещая очередной байт на подобающее ему место. В вашем случае используется второй подход. Замечу, что оба подхода сработают вне зависимости от родного порядка байт платформы, так как не важно, как будет храниться целевое число — важно, в какие разряды универсального (где старшие разряды всегда слева — 0xabcdefgh...) представления вы их запишете — остальным озаботится процессор.
Комментариев нет:
Отправить комментарий