Check-sum com operação OU EXCLUSIVO

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???

Não seria isso?

private static byte checksum(byte[] bytes) { byte resultado = bytes[0]; int leftPos = 1; while (leftPos < bytes.length) { resultado ^= bytes[leftPos]; leftPos++; } return resultado; }

Cuidado que 0 não é um elemento neutro no ou exclusivo.

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;
    }