Intereting Posts

Преобразование в 64 бит int

Поэтому я работаю на 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 

Я делаю что-то неправильно?

Solutions Collecting From Web of "Преобразование в 64 бит int"

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);