Estou implementando um protocolo em socket, o qual exige o cálculo do checksum conforme a seguinte descrição:
Para isto, construi o seguinte método:
private static byte checksum(byte[] bytes) {
byte resultado = new Byte("0");
int leftPos = 0;
while (leftPos < bytes.length) {
resultado ^= bytes[leftPos];
leftPos++;
}
return resultado;
}
Acredito que a implementação tem alguma coisa errada, pois o valor retornado não está batendo com o valor esperado pelo servidor.
Alguém saberia me esclarecer como fazer tal implementação???
Desconfio que esteja acontecendo aquele maldito problema de que o byte do Java é o signed char do C ,ou seja, vai de -128 a +127. Isso faz com que, se o byte resultante for em hexadecimal algo entre 0x80 e 0xFF, apareça como negativo em vez do valor esperado no manual. Eu aconselharia retornar um int, em vez de um byte, para evitar surpresas desagradáveis.
Não é necessário se preocupar com o 0; 0 XOR x é sempre x.
Além disso, neste caso em particular é melhor usar um for, em vez de um while.
Embora o código gerado seja exatamente o mesmo, o for expressa melhor a operação de “executar a mesma operação sobre todos os elementos de uma coleção”.
private static int checksum(byte[] bytes) {
int resultado = 0;
for (int i = 0; i < bytes.length; ++i) {
resultado = resultado ^ (bytes [i] & 0xFF);
}
return resultado;
}