Como converter um valor hexadecimal em um inteiro assinado em PHP?

Estou tentando converter uma string hexadecimal em um inteiro assinado.

Eu posso transferi-lo facilmente para um valor não assinado com hexdec (), mas isso não dá um valor assinado.

Editar:

código em VB – os dois valores hexadecimais “AA” são representativos.

Dim bs(2) As Byte bs(1) = "AA" bs(2) = "AA" Dim s As Short s = BitConverter.ToInt16(bs, 1) 

Confira este comentário via php.net:

hexdec () retorna inteiros não assinados. Por exemplo, hexdec (“FFFFFFFE”) retorna 4294967294, não -2. Para converter em um inteiro de 32 bits assinado, você pode fazer:

 < ?php echo reset(unpack("l", pack("l", hexdec("FFFFFFFE")))); ?> 

Conforme mencionado na página do manual do hexdec :

A function agora pode converter valores que são grandes para o tipo inteiro de plataformas, ele retornará o valor como flutuador em vez disso nesse caso.

Se você quiser obter algum tipo de grande inteiro (não flutuante), você precisará armazenado dentro de uma string … Isso pode ser possível usando as funções de BC Math .

Por exemplo, se você olhar nos comentários da página do manual do hexdec, você encontrará esta nota

Se você adaptar essa function um pouco, para evitar um aviso, você receberá:

 function bchexdec($hex) { $dec = 0; $len = strlen($hex); for ($i = 1; $i < = $len; $i++) { $dec = bcadd($dec, bcmul(strval(hexdec($hex[$i - 1])), bcpow('16', strval($len - $i)))); } return $dec; } 

(Esta function foi copiada da nota que eu liguei e apenas um pouco adaptado por mim)

E usá-lo em seu número:

 $h = 'D5CE3E462533364B'; $f = bchexdec($h); var_dump($f); 

O resultado será:

 string '15406319846273791563' (length=20) 

Então, não é o tipo de grande flutuação que você teve; e parece estar bem com o que você está esperando:

Resultado de calc.exe = 15406319846273791563

Espero que esta ajuda 😉
E, sim, as notas do usuário sobre a documentação do PHP às vezes são uma mina de ouro real 😉