2014-03-04 155 views
1

我正在制作一个需要使用Steam API的网站。不过,我在PHP中将64位整数转换为32位存在问题。在32位PHP安装中将64位整数转换为32位?

我看到了另一篇文章,一个答案here,导致我使用此代码:

$y = 76561197998705985; 

$x = $y & 0xffffffff; 

echo $x; 

但是,因为我使用的XAMPP其中只有32位安装,我得到的结果是错误1(38440256而不是38440257)。

上面提到的另一篇文章提到使用PHP GMP扩展在32位安装中进行转换,但通过官方文档here,我发现没有任何有用的指导,对于这种类型的新手很没有帮助。

一些澄清/帮助将不胜感激!

回答

1

您是否试过示例代码?

$and = gmp_and("0xffffffff", "76561197998705985"); 
echo gmp_strval($and) . "\n"; 

#Convert back to int 
$asInt = gmp_intval($and); 
+0

叫我笨,但我得到这个错误'致命的错误:调用未定义的函数gmp_and()在C:\ xampp \ htdocs \ DotaTestPhps \ TestArrayLoop.php在第3行 - 我错过了一个步骤启动'gmp_and '功能? – k4kuz0

+1

更有可能你的php.ini中没有启用gmp:寻找'; extension = php_gmp.dll',并确保它没有被注释掉,在启用后重新启动你的web服务器 –

+0

@MarkBaker啊谢谢。我取消注释但忘了重启网络服务器。代码有效! – k4kuz0

0

我怀疑这是一个浮点四舍五入问题,一旦数目超过PHP_INT_MAX它会悄悄地转换为浮点并因此失去精度,请参见第64位PHP这个例子:

php> PHP_INT_MAX 
int(9223372036854775807) 
php> 9223372036854775807 
int(9223372036854775807) 
php> 9223372036854775807 + 1 
double(9.2233720368548E+18) 

你会必须将您的号码存储为字符串以避免此问题。

+0

因此,在64位和32位之间转换的唯一答案是将其存储为字符串?我看到的方法如何,但不知道PHP GMP扩展? – k4kuz0

+0

@ k4kuz0 GMP在内部使用Strings/Resources,输入必须是一个字符串,否则您已经失去了精度。 – TimWolla

+0

我明白了。任何帮助如何做到这一点?到目前为止,我知道尽可能多地从另一个职位获得。我不知道如何使用GMP,并且文档似乎没有那么有用(至少对我而言)。 – k4kuz0