Преобразование в 64-битный int - PullRequest
1 голос
/ 16 августа 2011

Так что я работаю в PHP, чтобы конвертировать Steam Id, с которым многие из вас могут быть знакомы.У меня есть следующий Steam ID:

STEAM_0:1:1514332

Теперь мне нужно преобразовать это в 64-битную версию, которая также является идентификатором сообщества.После просмотра официального релиза 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:        76561197963294393
PHP generated: 76561197963294000

При изменении равновесия, чтобы получить мой steam идентификатор от идентификатора сообщества, я получаю: 1514335.5

Вот простой пример рассматриваемого php:

//STEAM_0:1:1514332

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

Я что-то не так делаю?

Ответы [ 9 ]

3 голосов
/ 16 августа 2011

PHP не имеет 64-битного int на 32-битном двоичном. Здесь используется с плавающей запятой. см. как получить 64-битное целое число на PHP?

В вопрос включены ссылки на BC Math , которые могут быть использованы для вашей задачи.

3 голосов
/ 12 января 2013

Лично я использую следующий код, и он отлично работает для разделения идентификатора Steam и определения 64-битного идентификатора сообщества:

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

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

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

$ w будет правильно отформатированным идентификатором. Я подумал, что это может быть полезно, так как я обнаружил, что пытаюсь сделать то же самое:)

1 голос
/ 27 сентября 2015

У меня была проблема.Я использую xampp на Windows, и он использует 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";
?>
0 голосов
/ 22 ноября 2015

Очень старая тема, но я просто хотел поделиться тем, как я ее решил, так как у меня был 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);
0 голосов
/ 14 января 2012

Я знаю, что это очень старый вопрос, но он все равно ответит (в вашем конкретном контексте, а не только как использовать 64-битные целые числа).

Не добавляйте 76561197960265728. Просто умножьте 3-ю часть SteamID на 2 и добавьте в нее 2-ю часть. Затем перейдите на страницу сообщества, используя URL http://steamcommunity.com/profiles/[U:1:result of the expression]. В вашем случае это будет http://steamcommunity.com/profiles/[U:1:3028665].

0 голосов
/ 16 августа 2011

Вы не делаете ничего плохого.Формула верна (с помощью калькулятора я получаю «фактическое» число).

Должна быть либо проблема округления или вычисления, либо простой предел ОС для него.

0 голосов
/ 16 августа 2011

Используя расширение BCMath , вы можете сделать следующее:

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

Что является преобразованием уравнения выше.Он возвращает строку, а не int, что позволяет избежать проблемы 32bit int.

0 голосов
/ 16 августа 2011

попробуйте добавить (string) перед этими вычислениями

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

и будет работать всегда;

демо

ответ: 76561197963294393

0 голосов
/ 16 августа 2011

Вы можете использовать расширение BC Math PHP. Вот фрагмент кода:

//STEAM_0:1:1514332

$a = bcadd(bcadd((1514332 * 2), 76561197960265728), 1);
echo $a; //76561197963294393
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...