Каковы возможные способы преобразования этих определений битовой маски из пешечного языка в PHP?

Ну, чтобы уточнить, pawn — это язык, очень похожий на C++. Я программирую панель управления администратора, для которой требуются разрешения на битовую маску (в php), и я на самом деле не знаю, правильно ли я преобразовал разрешения (поскольку я никогда этого не делал) в PHP. Я использовал define() для определения разрешений. Вот как это было изначально (в залоге):

//Pawn
enum EAdminFlags (<<= 1) {
    EAdminFlags_None = 0, 
    EAdminFlags_BasicAdmin = 1, //kick, fine, etc 0
    EAdminFlags_CanGiveGuns, //1
    EAdminFlags_HouseAdmin, //2
    EAdminFlags_IRCAdmin, //3
    EAdminFlags_BusinessAdmin, //4
    EAdminFlags_AdminManage, //5 can see invisible admins/manipulate admin flags
    EAdminFlags_Scripter, //getpvars, reloadcmds, stuff only scripters should need 6
    EAdminFlags_HelperManage, // 7 manage helpers/teachers
    EAdminFlags_Unbannable, //unbanable under ANY circumstances 8
    EAdminFlags_CanRefundSelf, //can refund himself
    EAdminFlags_VehicleAdmin, //10 can manipulate player vehicles
    EAdminFlags_AntiCheat, //immune to the anticheat 11
    EAdminFlags_BigEars, //can /bigears, /bigfamilyears, /bigmouth
    EAdminFlags_SetName, //13
    EAdminFlags_CanHide, //can toggle/untoggle hidden on themselves 14
    EAdminFlags_Invisible, //Invisible on admins list(like 9999s before) 15
    EAdminFlags_GiveDrugs, //server manager, can restart the server/do rcon cmds, create job cars 16
    EAdminFlags_Unban, //can unban, oban, oprison people 17
    EAdminFlags_WeatherManage, //can manage weather/time 18
    EAdminFlags_GiveRestrictedGun, //can give restircted guns 19
    EAdminFlags_TeleportOthers, //can teleport other people 20
    EAdminFlags_CanBanAdmins, //can ban other admins(or any punishments) 21
    EAdminFlags_GiveMats, //can give materials 22
    EAdminFlags_StatsManage, //23 /setstat, /sethp, /setarmor
    EAdminFlags_FamilyAdmin, //24
    EAdminFlags_FactionAdmin, //25
    EAdminFlags_MassCmds, //26 can do /masstphere, /massmoney, /masskick, /massnuke
    EAdminFlags_Nuke, //27 can do things like /nuke, sparta, rangeban
    EAdminFlags_RangeBan, //28 can range ban
    EAdminFlags_GiveMoney, //29 can /givemoney /money
    EAdminFlags_Donations, //30 can give DPS/set donate rank
    EAdminFlags_ServerManager, //can restart the server, etc, use /noooc, /nopms, /nonewb
    EAdminFlags_All = -1,
};

Вот как я определил это в PHP:

    define("EAdminFlags_None",0);
    define("EAdminFlags_BasicAdmin",1);
    define("EAdminFlags_CanGiveGuns",1 << 0);
    define("EAdminFlags_HouseAdmin",1 << 1);
    define("EAdminFlags_IRCAdmin",1 << 2);
    define("EAdminFlags_BusinessAdmin",1 << 3);
    define("EAdminFlags_AdminManage",1 << 4);
    define("EAdminFlags_Scripter",1 << 5);
    define("EAdminFlags_HelperManage",1 << 6);
    define("EAdminFlags_Unbannable",1 << 7); 
    define("EAdminFlags_CanRefundSelf",1 << 8);
    define("EAdminFlags_VehicleAdmin",1 << 9);
    define("EAdminFlags_AntiCheat",1 << 10);
    define("EAdminFlags_BigEars",1 << 11);
    define("EAdminFlags_SetName",1 << 12);
    define("EAdminFlags_CanHide",1 << 13);
    define("EAdminFlags_Invisible",1 << 14);
    define("EAdminFlags_GiveDrugs",1 << 15);
    define("EAdminFlags_Unban",1 << 16);
    define("EAdminFlags_WeatherManage",1 << 17);
    define("EAdminFlags_GiveRestrictedGun",1 << 18);
    define("EAdminFlags_TeleportOthers",1 << 19);
    define("EAdminFlags_CanBanAdmins",1 << 20);
    define("EAdminFlags_GiveMats",1 << 21);
    define("EAdminFlags_StatsManage",1 << 22);
    define("EAdminFlags_FamilyAdmin",1 << 23);
    define("EAdminFlags_FactionAdmin",1 << 24);
    define("EAdminFlags_MassCmds",1 << 25);
    define("EAdminFlags_Nuke",1 << 26);
    define("EAdminFlags_RangeBan",1 << 27);
    define("EAdminFlags_GiveMoney",1 << 28);
    define("EAdminFlags_Donations",1 << 29);
    define("EAdminFlags_ServerManager",1 << 30);
    define("EAdminFlags_All",-1);

Я сравнил битовые флаги, и в большинстве случаев он просто распознает разрешение EAdminFlags_All вместе с EAdminFlags_None и EAdminFlags_BasicAdmin. Так что, вероятно, есть проблема с тем, как я определил это в PHP. Разрешения хранятся в базе данных, и они сохраняются как необработанное целочисленное значение, например: 51531777 Затем оно загружается в PHP и сравнивается следующим образом:

$account = new Account(Auth::getUserID());
echo "Welcome ".$account->getUsername()."<br>";
if($account->getAdminPerms(EAdminFlags_FamilyAdmin)) { 
    echo "You are a family admin."; //testing purposes
    //If the person has those permissions set then display he / she is a family admin but even if the permissions are set to EAdminFlags_BasicAdmin, it will still display it wrong
}
public function getAdminLevel() {
    return $this->adminlevel; //This holds the integer value "51531777"
}
public function getAdminPerms($n) {
    return ($this->adminlevel & (1 << $n)) != 0;
}

Спасибо за вашу помощь заранее, я очень ценю это.


person Ignacio Belhot Colistro    schedule 16.01.2013    source источник
comment
вероятно есть проблема Какая проблема? В чем проблема? На первый взгляд нормально.   -  person feeela    schedule 16.01.2013
comment
Для начала проверили ли вы, что все ваши константы на самом деле определены правильно. Распечатайте их и убедитесь, что они никогда не бывают ничем иным, как степенью двойки: 1, 2, 4, 8, 16, 32,...   -  person Sven    schedule 16.01.2013
comment
Он показывает неправильные разрешения или некоторые разрешения даже не отображаются. Он также не будет проверять, установлен ли у пользователя флаг или нет.   -  person Ignacio Belhot Colistro    schedule 16.01.2013


Ответы (2)


Предполагая, что ваши операции сдвига над константами верны, возникает ошибка при обнаружении определенного флага прав:

public function getAdminPerms($n) {
    return ($this->adminlevel & (1 << $n)) != 0;
}

Вход - это значение флага, которое представляет собой всего 1 бит, установленный в правильном положении. Вы снова неправильно выполняете сдвиг, но все, что вам нужно сделать, это И целочисленное значение с тем, которое было прочитано из базы данных:

public function getAdminPerms($n) {
    return ($this->adminlevel & $n)) != 0;
}

Обратный путь работает так же. Начиная с нулевого значения, вы можете добавить все флаги прав администратора с битовым ИЛИ всех постоянных значений без смещения:

$newAdmin = EAdminFlags_AntiCheat | EAdminFlags_CanGiveGuns;
person Sven    schedule 16.01.2013
comment
Спасибо, вы только что помогли мне решить огромную проблему, с которой я столкнулся, теперь я могу начать работать над этим прямо сейчас. - person Ignacio Belhot Colistro; 16.01.2013

define("EAdminFlags_BasicAdmin",1);
define("EAdminFlags_CanGiveGuns",1 << 0);

эти два эквивалентны... сдвиг на 0 в основном является нулевой операцией, поэтому "cangiveguns" имеет то же значение, что и basicadmin

person Marc B    schedule 16.01.2013
comment
Думаю, мне следует изменить его, чтобы он начинался с единицы. - person Ignacio Belhot Colistro; 16.01.2013