Php 不一致位权限计算器

Php 不一致位权限计算器,php,api,bitwise-operators,discord,Php,Api,Bitwise Operators,Discord,我试图让我的工具/脚本确定登录用户是否具有使用该工具的正确权限。但是,Discord使用权限int进行响应 似乎我必须使用位运算符检查权限,但从我在谷歌上搜索过的所有内容来看,我发现的几乎所有内容似乎都完全无关 权限示例:2146958591 权限引用 //概述 generalCreateInstantInvite:0x1, GeneralClickMembers:0x2, 一般成员:0x4, 总管理员:0x8, GeneralManager通道:0x10, GeneralManager服务器:

我试图让我的工具/脚本确定登录用户是否具有使用该工具的正确权限。但是,Discord使用权限int进行响应

似乎我必须使用位运算符检查权限,但从我在谷歌上搜索过的所有内容来看,我发现的几乎所有内容似乎都完全无关

权限示例:
2146958591

权限引用

//概述
generalCreateInstantInvite:0x1,
GeneralClickMembers:0x2,
一般成员:0x4,
总管理员:0x8,
GeneralManager通道:0x10,
GeneralManager服务器:0x20,
一般更改昵称:0x4000000,
GeneralManager昵称:0x8000000,
GeneralManager角色:0x10000000,
generalManageWebhooks:0x20000000,
GeneralManageMojis:0x40000000,
generalViewAuditLog:0x80,
//正文
textAddResponses:0x40,
textReadMessages:0x400,
textSendMessages:0x800,
textSendTTS消息:0x1000,
textManageMessages:0x2000,
文本链接:0x4000,
文本附件文件:0x8000,
textReadMessageHistory:0x10000,
text每个人:0x20000,
textUseExternalEmojis:0x40000,
//声音
voiceViewChannel:0x400,
语音连接:0x100000,
voiceSpeak:0x200000,
VoiceMute成员:0x400000,
voiceDeafenMembers:0x800000,
voiceMoveMembers:0x1000000,
voiceUseVAD:0x2000000
是否有我可以研究的工具或示例脚本,以确定如何进行此计算


提前谢谢你

要检查给定的权限值是否具有选定的权限,请使用位AND运算符

例如:

$canKickMembers = ($permissionCode & 0x2) != 0;

假设您有
4个
不同的操作要允许或禁止每个用户:

  • 创建帖子
  • 更新帖子
  • 阅读文章
  • 删除帖子
让我们创建一个4个字符的字符串
1
0
。字符串中的第一个字符表示用户可以
创建post
操作。第二个字符–
更新帖子
,第三个字符–
阅读帖子
,第四个字符–
删除帖子
。例如,如果用户拥有权限
1001
,则他可以创建帖子和删除帖子,但不能更新和阅读

存储这些权限最有效的方法是什么?我们在字符串的每个位置都只有
0
1
,因此我们可以将这些数据存储在数字的二进制表示形式中,而不是存储在字符串中。因此,用户的权限将是一些十进制数字,该数字的每一位都表示对特定操作的权限

例如,我们的权限字符串
1001
将只是十进制数
9
=1*2^0+0*2^1+0*2^2+1*2^3

我们可以将每个权限表示为二进制:

  • 创建帖子=
    1000
  • 更新post=
    0100
  • 读取post=
    0010
  • 删除post=
    0001
但我们如何检查用户是否具有特定权限或一组权限?这很简单,让我们使用位运算符
&

如果用户权限等于
9
=
1001
b,则:

  • 1001&1000=1000
    1000>0
    –用户可以创建帖子
  • 1001&0100=0000
    0000==0
    ——用户无法更新帖子
  • 1001&0010=0000
    0000==0
    ——用户无法阅读帖子
  • 1001&0001=0001
    0001>0
    –用户可以删除帖子

回来有点晚了,但你的解释切中要害!谢谢你!谢谢你简单明了的解释。我的javascript实现
const operationMapping={1:'create',2:'read',4:'update',8:'delete',};设数字=[1,2,4,8];让结果=[];numbers.map(number=>{if((operationId&number)>0){result.push(operationMapping[number]);});返回结果