2012-06-22 79 views
0

我想使用base_convert函數將60位二進制數據轉換爲十六進制代碼,如下所示。但結果是不正確的。下面的代碼的輸出是4e08556312ffc00,但正確的輸出是4E08556312FFBFF。 有人可以告訴我爲什麼嗎?是60位太大的功能?base_convert()函數的最大數量限制是多少?

echo "The beacon ID in Hexadecimal is".base_convert 
     ("010011100000100001010101011000110001001011111111101111111111",2, 16); 

感謝

+0

這可能是您的問題:由於與使用的內部「double」或「float」類型相關的屬性,_base_convert()可能會失去大數精度。請參閱手冊中的[浮點數字](http://www.php.net/manual/en/language.types.float.php)以獲取更多具體信息和限制._(取自手冊) – Bono

+0

我不知道是否有任何解決方法或替代功能,可以將60位轉換爲十六進制 – user1062893

+1

您可以隨時自行完成...;) – deceze

回答

0

根據base_convertfloating numbers文檔,base_convert將失去大量的精度。

相反的,你可以使用bin2hex,這不限(此功能的使用和返回字符串)

+0

+1用於提示替代;) – Bono

+1

只有'bin2hex'不適用於人工二進制像「00101001 ...」這樣的字符串......「 – deceze

+0

謝謝,但bin2hex在這裏不起作用。根據手冊的說明,轉換是通過函數 – user1062893

1

我已經發布了一個基本轉換功能,沒有這種限制的實現在回答另一個問題here

0

我的測試顯示超過43位的精度損失。

我使用默認設置在Win XP base + easyphp 3.1.81上工作。

我使用這個base_convert作爲一個族譜應用程序,並且43代的極限有時是不夠的。

0

它的較大:

  1. PHP_INT_MAX
  2. 最大連續整數集,可以被表示爲浮動。

典型PHP實現使用IEEE 754用於實現浮點數,其具有53位有效,因此對於32位環境的典型限制是2⁵³(0x20000000000000)和64位的環境下,限制爲2⁶3 -1(0x7fffffffffffffff)。

有一個簡單的解決方案,如果您有PHP GMP擴展(http://php.net/gmp):

$hexNumber = gmp_strval(gmp_init($binNumber, 2), 16) ; 

如果你有公元前擴展(http://php.net/bc),我(免費&開源)WeirdoCustomDigits module會做任意基地轉換和任意的數字字符,沒有限制。

如果你只是簡單地在base 2和base 16之間進行轉換,就像你的例子一樣,你可以在沒有bc或gmp的情況下進行轉換。查看WeirdoCustomDigits :: binFromHex()和WeirdoCustomDigits :: hexFromBin()的WeirdoCustomDigits模塊的源代碼。

相關問題