Фрагмент байтового массива с указанием номера порта
Вопрос
У меня есть байтовый массив, который содержит 6 байтов. Последние 2 представляют номер порта при поиске способа, которым два последних преобразуют эти байты в номер порта, который я нашел в этом фрагменте,
int port = 0;
port |= peerList[i+4] & 0xFF;
port <<= 8;
port |= peerList[i+5] & 0xFF;
это работает, но мне нужно уточнить, как это работает?
Решение
======================= | byte 5 | byte 6 | |----------|----------| | 01010101 | 01010101 | =======================
По сути, он занимает байт № 5, сдвиг на 8 бит влево приводит к 0101010100000000
, а затем использует побитовый оператор или оператор для помещения байта 6 вместо нулей.
Другие советы
int port = 0; // Start with zero
port |= peerList[i+4] & 0xFF; // Assign first byte to port using bitwise or.
port <<= 8; // Shift the bits left by 8 (so the byte from before is on the correct position)
port |= peerList[i+5] & 0xFF; // Assign the second, LSB, byte to port.
Код просто берет последние 2 байта из массива и использует их как число с прямым порядком байтов.
Обычно в сетевых пакетах номер порта передается с прямым порядком байтов (это означает, что байт с более низким адресом является более значимым).
Код принимает номер байта i + 4 и использует его в качестве MSB, а байт i + 5 - в качестве LSB номера порта.