dechex()所能转换的最大数值为十进制的 2147483647,其结果为 "7fffffff"。 
最近在做OpenSSL的项目,函数库里面有个openssl_x509_parse(),它分解出来的证书的序列号是long型的,数值很大,例如"9126364204485167585",我想把它还原成16进制的序列号,各位大虾有没有什么好办法呀? 

解决方案 »

  1.   

    char* convert( unsigned long Value ){
    static char Buffer[sizeof( unsigned long ) * 2 + 1];
    int i;for( i = sizeof( unsigned long ) * 2 - 1; i >= 0; --i )
    {
    Buffer[i] = "0123456789ABCDEF"[Value % 16];
    Value /= 16;
    }
    return Buffer;} 
      

  2.   

    这样不行吧?unsigned long 放不了那么大的数值
      

  3.   

    可以依靠十六进制转换十进制的方式自己写一个方法
    <?php
    function new_dechex($num)
    {
    //$sixteen = array("A"=>10, "B"=>11, "C"=>12, "D"=>13, "E"=>14, "F"=>15);
    $sixteen = array(10=>"A", 11=>"B", 12=>"C", 13=>"D", 14=>"E", 15=>"F");

    $s = $num;

    while($s > 0)
    {
    $y[] = $s%16;
    $s = floor($s/16);
    } $str = "";

    $y_n = count($y);
    for($i=$y_n-1;$i>=0;$i--)
    {
    if(array_key_exists($y[$i], $sixteen))
    {
    $str .= $sixteen[$y[$i]];
    }
    else $str .= $y[$i];
    }
    //return "0x".$str;
    return $str;
    }
    echo new_dechex(9126364204485167585)." <br>". new_dechex(2147483647);
    ?>
      

  4.   

    可以借助bcmath库,自己写一个函数(类似楼上,但是需要用bcmatch)
    bcmath可以处理几乎无限大的数
    http://ca.php.net/manual/en/book.bc.php