Поэтому я работаю на PHP, чтобы преобразовать идентификатор Steam, о котором многие из вас могут быть знакомы. У меня есть следующий идентификатор пара:
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 и тем, что я генерирую
Actual: 76561197963294393 PHP generated: 76561197963294000
Когда вы 1514335.5
, чтобы получить свой идентификатор пара из идентификатора сообщества, я получаю: 1514335.5
Вот простой пример рассматриваемого php:
//STEAM_0:1:1514332 $a = (1514332 * 2) + 76561197960265728 + 1; echo $a; //76561197963294000
Я делаю что-то неправильно?
PHP не имеет 64-битного int в 32-битном двоичном формате. Здесь используется с плавающей запятой. посмотреть, как иметь 64-битное целое число на PHP?
Вопрос включает ссылки на BC Math , которые могут быть использованы для вашей проблемы.
Лично я использую следующий код, и он отлично работает для разделения идентификатора 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 будет правильно отформатированным идентификатором. Я думал, что это может быть полезно, так как я нашел это, пытаясь сделать то же самое 🙂
У меня была проблема. Я использую xampp для Windows и использую 32-битную версию php, но я только что закончил создание рабочего скрипта 🙂 он может конвертировать 64-битные паровые пары в 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"; ?>
попробуйте добавить (string)
перед этими вычислениями
$a = (string) (1514332 * 2) + 76561197960265728 + 1;
и он будет работать всегда;
демонстрация
ответ: 76561197963294393
Используя расширение BCMath , вы можете сделать следующее:
bcadd(bcadd(bcmul('1514332', '2'), '76561197960265728'), 1)
Который является преобразованием уравнения выше. Он возвращает строку, а не int, тем самым избегая проблемы с 32-битным int.
Вы ничего не делаете неправильно. Формула правильная (с помощью калькулятора я получаю «фактическое» число).
Должна быть проблема округления или расчета или простой для нее лимит ОС.
Вы можете использовать расширение BC Math PHP. Вот фрагмент:
//STEAM_0:1:1514332 $a = bcadd(bcadd((1514332 * 2), 76561197960265728), 1); echo $a; //76561197963294393
Я знаю, что это очень старый вопрос, но все равно ответит (в вашем конкретном контексте, а не только на то, как использовать 64-битные целые числа).
Не добавляйте 76561197960265728. Просто умножьте 3-ю часть SteamID на 2 и добавьте вторую часть к ней. Затем перейдите на страницу сообщества, используя URL http://steamcommunity.com/profiles/[U:1:result of the expression]
. В вашем случае это будет http://steamcommunity.com/profiles/[U:1:3028665]
.
Очень старая тема, но просто хотела поделиться тем, как я ее решил, так как у меня был 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);