Convertendo xor, shr e shl de Delphi para PHP
Estou migrando um software feito em Delphi para PHP e me deparei com um problema em uma maldita bendita função de criptografia.
Sofri um bocado tentando reescrever a função não pela complexidade do código e sim com as diferenças nos resultados.
A função faz uso dos operadores XOR e SHR na versão Delphi. O SHR foi relativamente fácil graças a experiência com operadores bit a bit e como a documentação do Delphi diz que o operador retira bits à direita de um número inteiro (como se percebe uma abreviação de SHift Right e o inverso é o operador SHL – SHift Left) fiz testes usando o operador >> e acertei de primeira.
Já o operador XOR foi mais complicado. O PHP possui este operador e não me dei o trabalho de me certificar se ambos fazem a mesma coisa. Só quando fiz alguns testes usando diferentes inteiros é que pude perceber que não dão resultados iguais. No Delphi ele sempre retornava algum número enquanto em PHP ele retornava 1 ou 0 (na verdade true ou false).
Só quando li a documentação de ambas as linguagens percebi que são diferentes. No Delphi XOR é uma operação de comparação exclusiva (OR exclusivo) que retorna verdadeiro ou falso OU uma operação bit a bit de dois argumentos. No PHP XOR é apenas um operador para OR exclusivo. Ele não faz a operação de ajustes nos bits. O equivalente neste caso é o operador ^ (circunflexo).
Mais um aprendizado. Espero que ajude mais alguém algum dia.
Segue alguns links úteis.
One Response
cara…;. eu tava me batendo usando o xor no php…;. mudei para ^ e deu tudo certo. obrigado pela ajuda 😀