Clarificação de trechos matriz de bytes para o número da porta
Pergunta
Eu tenho uma matriz de bytes que contém 6 bytes última 2 representa o número da porta enquanto procura uma maneira de dois converter estes últimos a bytes para um número de porta i já se deparou com esse trecho,
int port = 0;
port |= peerList[i+4] & 0xFF;
port <<= 8;
port |= peerList[i+5] & 0xFF;
ele funciona, mas eu preciso de alguns esclarecimentos sobre a forma como ele funciona?
Solução
======================= | byte 5 | byte 6 | |----------|----------| | 01010101 | 01010101 | =======================
Basicamente, leva byte # 5, deslocamento é de 8 bits para a esquerda resultando na 0101010100000000
e então usa o bit a bit ou operador para colocar o byte 6 no lugar de zeros.
Outras dicas
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.
O código simplesmente toma os últimos 2 bytes do array e os usa como um número big-endian.
Normalmente, em pacotes de rede o número da porta é transferido em grande-endian (ou seja, o byte com o endereço mais baixo é mais significativo).
O código leva número de byte i + 4 e usa-o como o MSB e byte i + 5 como o bit menos significativo do número de porta.