2012-06-22 80 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模块的源代码。

相关问题