我想使用base_convert函数将60位二进制数据转换为Hex代码,如下所示。但结果不正确。以下代码的输出为4e08556312ffc00,但正确的输出为4E08556312FFBFF。 谁能告诉我为什么?功能是60位太大了?
echo "The beacon ID in Hexadecimal is".base_convert
("010011100000100001010101011000110001001011111111101111111111",2, 16);
感谢
答案 0 :(得分:2)
在我对另一个问题here的回答中,我发布了一个基本转换函数的实现,没有这些限制。
答案 1 :(得分:0)
根据base_convert和floating numbers文档,base_convert
将失去对大数字的精确度。
而不是,您可以使用bin2hex
,这不受限制(此函数使用并返回字符串)
答案 2 :(得分:0)
我的测试显示超过43位的精度损失。
我使用默认设置在Win XP base + easyphp 3.1.81上工作。
我将这个base_convert用于家谱应用,43代的限制 - 有时 - 不够。
答案 3 :(得分:0)
它是更大的:
典型的PHP实现使用IEEE 754实现浮点数,其具有53位有效数,因此32位环境的典型限制是2⁵³(0x20000000000000
),对于64位环境,限制是2⁶³-1(0x7fffffffffffffff
)。
如果你有PHP gmp扩展名(http://php.net/gmp),那就有一个简单的解决方案:
$hexNumber = gmp_strval( gmp_init( $binNumber, 2 ), 16 ) ;
如果你有bc扩展名(http://php.net/bc),我的(免费和开源)WeirdoCustomDigits module将使用任意基数和任意数字字符进行转换,但没有限制。
如果您只是在基数2和基数16之间进行转换,就像您的示例一样,您可以在没有bc或gmp的情况下进行转换。请参阅WeirdoCustomDigits模块中的源代码,了解WeirdoCustomDigits :: binFromHex()和WeirdoCustomDigits :: hexFromBin()。