0

bcmath 関数を使用する Web から取得した PHP 関数があります。

function SteamID64to32($steamId64) {
    $iServer = "1";
    if(bcmod($steamId64, "2") == "0") {
        $iServer = "0";
    }
    $steamId64 = bcsub($steamId64,$iServer);
    if(bccomp("76561197960265728",$steamId64) == -1) {
        $steamId64 = bcsub($steamId64,"76561197960265728");
    }
    $steamId64 = bcdiv($steamId64, "2");
    return ("STEAM_0:" . $iServer . ":" . $steamId64);
}

有効な入力に対して、関数はランダムに「.0000000000」を出力に追加します。

元:

$input = 76561198014791430;
SteamID64to32($input);

//result for each run
STEAM_0:0:27262851
STEAM_0:0:27262851.0000000000
STEAM_0:0:27262851
STEAM_0:0:27262851
STEAM_0:0:27262851.0000000000
STEAM_0:0:27262851
STEAM_0:0:27262851.0000000000
STEAM_0:0:27262851.0000000000
STEAM_0:0:27262851.0000000000

これは、php-fpm を実行する 2 つの異なる nginx サーバーでテストされました。ここで何が間違っているのかを理解するのを手伝ってください。ありがとう

4

2 に答える 2

1

私はこれを見つけました: SteamProfile

/**
 *      This file is part of SteamProfile.
 *
 *      Written by Nico Bergemann <barracuda415@yahoo.de>
 *      Copyright 2009 Nico Bergemann
 *
 *      SteamProfile is free software: you can redistribute it and/or modify
 *      it under the terms of the GNU General Public License as published by
 *      the Free Software Foundation, either version 3 of the License, or
 *      (at your option) any later version.
 *
 *      SteamProfile is distributed in the hope that it will be useful,
 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
 *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *      GNU General Public License for more details.
 *
 *      You should have received a copy of the GNU General Public License
 *      along with SteamProfile.  If not, see <http://www.gnu.org/licenses/>.
 */

// thanks to voogru for the id transformation algorithm (http://forums.alliedmods.net/showthread.php?t=60899)

class SteamID {
        private $sSteamID = '';
        private $sSteamComID = '';

        const STEAMID64_BASE = '76561197960265728';

        public function __construct($sID) {
                // make sure the bcmath extension is loaded
                if(!extension_loaded('bcmath')) {
                        throw new RuntimeException("BCMath extension required");
                }

                if($this->isValidSteamID($sID)) {
                        $this->sSteamID = $sID;
                        $this->sSteamComID = $this->convertToSteamComID($sID);
                } elseif($this->isValidComID($sID)) {
                        $this->sSteamID = $this->convertToSteamID($sID);
                        $this->sSteamComID = $sID;
                } else {
                        $this->sSteamID = '';
                        $this->sSteamComID = '';
                }
        }

        public function getSteamID() {
                return $this->sSteamID;
        }

        public function getSteamComID() {
                return $this->sSteamComID;
        }

        public function isValid() {
                return $this->sSteamID != '';
        }

        private function isValidSteamID($sSteamID) {
                return preg_match('/^(STEAM_)?[0-5]:[0-9]:\d+$/i', $sSteamID);
        }

        private function isValidComID($sSteamComID) {
                // anything else than a number is invalid
                // (is_numeric() doesn't work for 64 bit integers)
                if(!preg_match('/^\d+$/i', $sSteamComID)) {
                        return false;
                }

                // the community id must be bigger than STEAMID64_BASE
                if(bccomp(self::STEAMID64_BASE, $sSteamComID) == 1) {
                        return false;
                }

                // TODO: Upper limit?

                return true;
        }

        private function convertToSteamComID($sSteamID) {
                $aTMP = explode(':', $sSteamID);

                $sServer = $aTMP[1];
                $sAuth = $aTMP[2];

                if((count($aTMP) == 3) && $sAuth != '0' && is_numeric($sServer) && is_numeric($sAuth)) {
                        $sComID = bcmul($sAuth, "2"); // multipy Auth-ID with 2
                        $sComID = bcadd($sComID, $sServer); // add Server-ID
                        $sComID = bcadd($sComID, self::STEAMID64_BASE); // add this odd long number

                        // It seems that PHP appends ".0000000000" at the end sometimes.
                        // I can't find a reason for this, so I'll take the dirty way...
                        $sComID = str_replace('.0000000000', '', $sComID);

                        return $sComID;
                } else {
                        throw new RuntimeException("Unable to convert Steam-ID");
                }
        }

        private function convertToSteamID($sSteamComID) {
                $sServer = bcmod($sSteamComID, '2') == '0' ? '0' : '1';
                $sCommID = bcsub($sSteamComID, $sServer);
                $sCommID = bcsub($sCommID, self::STEAMID64_BASE);
                $sAuth = bcdiv($sCommID, '2');

                return "STEAM_0:$sServer:$sAuth";
        }
}
于 2014-05-10T00:23:31.450 に答える