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