Фрагмент байтового массива для уточнения номера порта - PullRequest
1 голос
/ 20 июня 2009

У меня есть байтовый массив, который содержит 6 байтов. Последние 2 представляют номер порта при поиске способа, которым два последних преобразуют эти байты в номер порта, с которым я столкнулся в этом фрагменте,



            int port = 0;
        port |= peerList[i+4] & 0xFF;
        port <<= 8;
        port |= peerList[i+5] & 0xFF;

это работает, но мне нужно уточнить, как это работает?

Ответы [ 3 ]

3 голосов
/ 20 июня 2009
    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.
1 голос
/ 20 июня 2009
  =======================
  |  byte 5  |  byte 6  |
  |----------|----------|
  | 01010101 | 01010101 |
  =======================

Обычно это занимает байт # 5, сдвиг на 8 бит влево, в результате чего получается 0101010100000000, а затем используется битовый оператор или оператор для помещения байта 6 вместо нулей.

0 голосов
/ 20 июня 2009

Код просто берет последние 2 байта из массива и использует их как число с прямым порядком байтов.

Обычно в сетевых пакетах номер порта передается в порядке с прямым порядком байтов (это означает, что байт с более низким адресом более значим).

Код принимает номер байта i + 4 и использует его в качестве MSB, а байт i + 5 - в качестве LSB номера порта.

...