/** * Converte um valor hexadecimal para decimal com complemento de dois para numeros negativos * @param string $hex Valor hexadecimal * @return string Valor decimal na forma de string */ function converter_hex_dec($hex) { // Determinar valor do bit mais significativo $len = strlen($hex); $total_bits = ($len % 2) ? ($len + 1) * 4 : $len * 4; $bin = str_pad(base_convert($hex, 16, 2), $total_bits, '0', STR_PAD_LEFT); // Valor negativo: fazer complemento de 2 if ($bin[0] == '1') { // Inverter bits $bin = strtr($bin, '01', '10'); // Somar 1 de forma binaria for ($i = $total_bits - 1; $i >= 0; --$i) { if ($bin[$i] == '0') { $bin[$i] = '1'; break; } else { $bin[$i] = '0'; } } $dec = '-'.base_convert($bin, 2, 10); // Valor positivo: apenas converter para decimal } else { $dec = base_convert($hex, 16, 10); } return $dec; }