转换为64位int

时间:2011-08-16 07:42:14

标签: php 64-bit

所以我正在使用PHP来转换Steam Id,很多人可能都熟悉它。我有以下蒸汽ID:

STEAM_0:1:1514332

现在,我需要将其转换为64位版本,这也是社区ID。在浏览Steams官方发布之后:http://developer.valvesoftware.com/wiki/SteamID并且在网上查找了很多地方后,我发现以下方法适用于此:

Let X,Y, and Z be defined by the Steam ID: STEAM_X:Y:Z
SteamCommunityID = (Z*2) + 76561197960265728 + Y

所以它有效!但是,我的ACTUAL社区ID与我正在生成的社区ID之间似乎不匹配

Actual:        76561197963294393
PHP generated: 76561197963294000

当逆转方位时,为了从社区ID中获取我的蒸汽ID,我得到:1514335.5

这是一个简单的php问题示例:

//STEAM_0:1:1514332

$a = (1514332 * 2) + 76561197960265728 + 1;
echo $a; //76561197963294000

我做错了吗?

9 个答案:

答案 0 :(得分:3)

PHP在32位二进制文​​件上没有64位int。它在这里使用浮点。见how to have 64 bit integer on PHP?

问题包括指向BC Math的链接,可用于解决您的问题。

答案 1 :(得分:3)

就个人而言,我使用以下代码,它可以很好地分割Steam ID并计算出64位社区ID:

$split = explode(":", $steamid); // STEAM_?:?:??????? format

$x = substr($split[0], 6, 1);
$y = $split[1];
$z = $split[2];

$w = ($z * 2) + 0x0110000100000000 + $y;

$ w将是格式正确的ID。我认为这可能有用,因为我发现这试图做同样的事情:))

答案 2 :(得分:1)

我遇到了这个问题。我在Windows上使用xampp,它使用的是32位版本的php,但我刚刚完成了一个正常工作的脚本:)它可以将64位的Steamid转换为32位,然后又乱七八糟。

<?php
//Starting 64bit steamid
$steamid = "76561198086186258";
echo "Original 64bit steamid: $steamid";

//64bit steamid to 32bit below
$authserver = bcsub($steamid, '76561197960265728') & 1;
$authid = (bcsub($steamid, '76561197960265728')-$authserver)/2;
$steamid = "STEAM_0:$authserver:$authid";
echo "<br/>32bit steamid: $steamid";

//32bit steamid to 64bit below
$id = explode(":", $steamid);
$authserver = $id[1];
$steamid64 = $id[2];
$steamid64 = $steamid64 * 2;
$steamid64 = bcadd($steamid64, 61197960265728);
if ($authserver == 1){$steamid64 = $steamid64 + 1;};
$steamid64 = "765$steamid64";
echo "<br/>new 64bit steamid: $steamid64";
?>

答案 3 :(得分:0)

您可以使用BC Math PHP扩展。这是一个片段:

//STEAM_0:1:1514332

$a = bcadd(bcadd((1514332 * 2), 76561197960265728), 1);
echo $a; //76561197963294393

答案 4 :(得分:0)

尝试在这些计算之前添加(string)

$a = (string) (1514332 * 2) + 76561197960265728 + 1;

它会一直有效;

demo

回复:76561197963294393

答案 5 :(得分:0)

使用BCMath扩展程序,您可以执行以下操作:

bcadd(bcadd(bcmul('1514332', '2'), '76561197960265728'), 1)

这是上述等式的转换。它返回一个字符串而不是一个int,从而避免了32位int问题。

答案 6 :(得分:0)

你没有做错任何事。公式是正确的(使用计算器我得到'实际'数字)。

必须有舍入或计算问题或简单的操作系统限制。

答案 7 :(得分:0)

我知道这是一个非常古老的问题,但仍会回答(在您的特定情况下,不仅仅是如何使用64位整数)。

不要添加76561197960265728.只需将SteamID的第3部分乘以2,然后将第2部分添加到其中。然后使用网址http://steamcommunity.com/profiles/[U:1:result of the expression]访问社区页面。在您的情况下,它将是http://steamcommunity.com/profiles/[U:1:3028665]

答案 8 :(得分:0)

非常古老的主题,但只是想分享我是如何解决它的,因为我有32位PHP并且不可能在我的主机上使用BCMath。 (感谢SiPlus提供解决方案)

这是一个片段:

# Convert Steam ID to Steam64 ID
$idParts = explode(':', $tradeOwnerSteamId32);
$authServer = intval($idParts[1]);
$accountNumber = intval($idParts[2]);
$tradeOwnerSteamId64 = (string) $accountNumber * 2 + $authServer;

//And using it in URL

$depositorInventory = json_decode(file_get_contents("https://steamcommunity.com/profiles/[U:1:$tradeOwnerSteamId64]/inventory/json/730/2"), true);