PHP hexdec ile büyük onaltılık değerler

5 Cevap php

Ben düzenli numaralarını görüntülemek isteyen bazı büyük HEX değerleri, örneğin, ben float dönüştürmek için) (hexdec kullanıyordum, ve ben ondalık dönüştürmek olduğunu PHP.net bir işlevi bulundu, ama bu bir tavan vurmak gibi görünüyor :

$h = 'D5CE3E462533364B';
$f = hexdec($h);
echo $f .' = '. Exp_to_dec($f);

Çıktı: 1.5406319846274E +19 = 15406319846274000000

Calc.exe = 15406319846273791563 sonucu

Büyük onaltılık değerleri dönüştürmek için başka bir yöntem var mı?

5 Cevap

hexdec manual page üzerine, şunları söyledi:

The function can now convert values that are to big for the platforms integer type, it will return the value as float instead in that case.

Eğer (float değil) büyük tamsayı çeşit almak istiyorsanız, bunu bir dize içinde depolanan gerekir. Bu BC Math fonksiyonlarını kullanarak mümkün olabilir.

Eğer hexdec elle sayfanın yorumlarına bakarsanız Örneğin, göreceksiniz this note

Eğer bir uyarı önlemek için, bu işlevi biraz uyum varsa, alırsınız:

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

(This function has been copied from the note I linked to; and only a bit adapted by me)

Ve sayısına kullanıyor:

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

Çıkış olacaktır:

string '15406319846273791563' (length=20)

Yani, değil yaşadığınız büyük şamandıra tür; ve bekliyoruz ne iyi görünüyor:

Result from calc.exe = 15406319846273791563


Hope this help ;-)
And, yes, user notes on the PHP documentation are sometimes a real gold mine ;-)

hexdec () sonuç bir int olarak temsil edilmesi çok büyük olduğunda float int geçer. Eğer keyfi uzun değerlerini isterseniz, muhtemelen bir GMP integer için onaltılık dizeyi değiştirmek için kendi dönüştürme işlevi rulo zorunda gidiyoruz.

function gmp_hexdec($n) {
  $gmp = gmp_init(0);
  $mult = gmp_init(1);
  for ($i=strlen($n)-1;$i>=0;$i--,$mult=gmp_mul($mult, 16)) {
    $gmp = gmp_add($gmp, gmp_mul($mult, hexdec($n[$i])));
  }
  return $gmp;
}

print gmp_strval(gmp_hexdec("D5CE3E462533364B"));

Output: 15406319846273791563

1.5406319846274E 19 numaraya sınırlı bir temsilidir. Sen printf kullanarak daha eksiksiz bir tane var () olabilir

printf("%u\n", hexdec($h));

... Irade çıktı "15406319846273792000". PHP bu tür büyük sayılar için yüzer kullanır, böylece hassas biraz kaybedebilirsiniz. Eğer keyfi duyarlıklı sayılar ile çalışmak varsa, bcmath extension deneyebilirsiniz. Iki 32-bit kelimelerin (çoğu sistemlerde güvenli olmalı) içine altıgen bölerek daha fazla hassasiyet elde etmek mümkün olmalıdır. Örneğin:

$f = bcadd(bcmul(hexdec(substr($h, 0, -8)), 0x100000000), hexdec(substr($h, 8)));

... 15406319846273791563 f $ açardı.

$num = gmp_init( '0xD5CE3E462533364B' ); // way to input a number in gmp
echo gmp_strval($num, 10); // display value in decimal

Yani kullanmak için modül var. Bir işleve dönüştürmek ve sonra numaraları kullanın.

Not: Bunu dizeleri olarak bu hex numaraları sağlamak:

$num = "0x348726837469972346"; // set variable
$gmpnum = gmp_init("$num"); // gmp number format
echo gmp_strval($gmpnum, 10); // convert to decimal and print out

intval(var, base) bunu dikkat çekmek değil mi?

Dan PHP Manual.