如何将十六进制值的总和转换回十六进制值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将十六进制值的总和转换回十六进制值相关的知识,希望对你有一定的参考价值。

我有一个包含很多十六进制值的对象,它是:

var perms = {
  // General
  generalCreateInstantInvite: 0x1,
  generalKickMembers: 0x2,
  generalBanMembers: 0x4,
  generalAdministrator: 0x8,
  generalManageChannels: 0x10,
  generalManageServer: 0x20,
  generalChangeNickname: 0x4000000,
  generalManageNicknames: 0x8000000,
  generalManageRoles: 0x10000000,
  generalManageWebhooks: 0x20000000,
  generalManageEmojis: 0x40000000,
  generalViewAuditLog: 0x80,
  // Text
  textAddReactions: 0x40,
  textReadMessages: 0x400,
  textSendMessages: 0x800,
  textSendTTSMessages: 0x1000,
  textManageMessages: 0x2000,
  textEmbedLinks: 0x4000,
  textAttachFiles: 0x8000,
  textReadMessageHistory: 0x10000,
  textMentionEveryone: 0x20000,
  textUseExternalEmojis: 0x40000,
  // Voice
  voiceViewChannel: 0x400,
  voiceConnect: 0x100000,
  voiceSpeak: 0x200000,
  voiceMuteMembers: 0x400000,
  voiceDeafenMembers: 0x800000,
  voiceMoveMembers: 0x1000000,
  voiceUseVAD: 0x2000000,
  voicePrioritySpeaker: 0x100
};

这些是discord API中的权限。 Discord中的角色具有多个权限,因此,discord使用parseInt()将它们相加并将它们转换为十进制值(常规整数值)并将它们存储在对象类中。例如,如果角色既有generalCreateInstantInvite又有generalKickMembersrole.permissions的结果将是9,因为它是0x10x8的总和,我知道因为我知道角色对它们有两个特定的权限。

快速摘要:

  1. 我有一个对象的perms列表。
  2. 我有一些十六进制值的总和。
  3. 我需要以某种方式将总和转换为值本身并将它们放在一个数组中。

我的问题是,如何使没有任何数据的机器人,权限列表(perms)和权限整数(9)使用它们并输出他们拥有的权限名称(generalCreateInstantInvitegeneralKickMembers)?或者可以有一个算法吗?如果您有任何可能有用的链接,请发送给我们。

javascript文件示例:

const Discord = require('discord.js');
const bot = new Discord.Client();
const perms = require('./Storage/perms.js');

bot.on('message', (message) => {
  let prefix = '/';
  let sender = message.author;
  let msg = message.content;
  let cont = msg.split(' ');
  let args = cont.slice(1);
  let cmd = msg.startsWith(prefix) ? cont[0].slice(prefix.length).toUpperCase() : undefined;

  if (cmd === 'GETPERMISSIONS') {
    let role = message.guild.roles.get(args[0]); // args[0] should be role ID
    let rolePerms = role.permissions; // rolePerms is sum of hex values

    // Converting back the hex sum to permission names and place in an array...

    message.channel.send(permNames.join(' - '));
    return;
  }
});
答案

最简单的方法是使用discord.js来转换它使用Permisions#toArray像这样使用:

new Discord.Permissions(role.permissions).toArray();

如果角色没有权限,它将给出一个空数组[]否则它将给出一个填充Permissions#FLAGS的数组

[ 'KICK_MEMBERS',
  'BAN_MEMBERS',
  'MANAGE_CHANNELS',
  'MANAGE_GUILD'
]

你显然也可以使用Permissions Class.的其他功能

以上是关于如何将十六进制值的总和转换回十六进制值的主要内容,如果未能解决你的问题,请参考以下文章

如何将包含 UTF-8 十六进制值的字符串转换为 C 中的 wchar?

c# winform 如何实现16进制颜色值的转换

通过核心数据计算十进制值的总和不能正常工作?

详细请教:关于十进制RGB颜色值转换十六进制颜色值的算法

详细请教:关于十进制RGB颜色值转换十六进制颜色值的算法

将包含以“0x”开头的十六进制值的字符串转换为整数或长整数