数值权限控制(C#)

本文介绍了一个用于数值权限管理的类库,能够实现权限的合并、拆分及验证等功能。通过数学运算来转换权限字符串与整数之间的对应关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

using System;
using System.Text;
using System.Text.RegularExpressions;

namespace HKH.Common
{
 /// <summary>
 /// 数值权限,以数字表示权限,该类实现权限的合并/拆分/验证
 /// </summary>
 /// <remarks>
 /// Write By Lwt on 2006 - 10 - 8
 /// </remarks>
 public class clsRight
 {
  private clsRight()
  {
  }

  /// <summary>
  /// 根据权限字符串生成权值
  /// </summary>
  /// <param name="strRight"></param>
  /// <returns></returns>
  /// <remarks>
  /// Truth : RightValue = Power(2,X) + Power(@,Y)
  /// </remarks>
  public static int MakeRightValue( string strRight )
  {
   if ( null == strRight || "" == strRight )
    return 0;

   double dRightValue = 0;
   MatchCollection mcRight = Regex.Matches(clsString.RemoveDup(strRight),@"/d+");

   foreach (Match mRight in mcRight)
   {
    dRightValue += Math.Pow(2,double.Parse(mRight.Value));
   }

   return Convert.ToInt32(dRightValue);
  }

  /// <summary>
  /// 反算权限字符串
  /// </summary>
  /// <param name="iRight"></param>
  /// <returns></returns>
  /// <remarks>
  /// Truth : X = Log(2,RightValue - Power(2,Y))
  /// </remarks>
  public static string GetRightString( int iRight )
  {
   if ( 0 == iRight )
    return null;

   int iTemp = iRight;
   double dLog = Math.Log(iTemp,2);
   StringBuilder szRight = new StringBuilder();

   while ( 0 != iTemp && dLog > 0 )
   {
    dLog = Math.Floor(dLog);

    #region 权值修正

    //因为精度的问题,在权值等于8时,取对数的结果为2.999999996,取Floor后为2,会发生取值错误
    //Truth : 如果一个数大于2的N次幂-1,小于2的N次幂+1,则该数等于2的N次幂
    if ( iTemp > (Math.Pow(2,dLog + 1) - 1) && iTemp < (Math.Pow(2,dLog + 1) + 1))
     dLog += 1;
    
    #endregion

    szRight.Append( "," );
    szRight.Append( Convert.ToInt32(dLog) );

    iTemp = iTemp - Convert.ToInt32( Math.Pow(2,dLog) );
    dLog = Math.Log( iTemp,2 );
   }

   return szRight.Remove(0,1).ToString();
  }

  /// <summary>
  /// 反算权限字符串
  /// 此重载用于父子权限合并
  /// </summary>
  /// <param name="iRights">各级权限组成的数组</param>
  /// <returns></returns>
  public static string GetRightString( int[] iRights)
  {
   if( null == iRights || 0 == iRights.Length )
    return null;

   return GetRightString( UniteRight (iRights) );
  }

  /// <summary>
  /// 验证权限
  /// </summary>
  /// <param name="iAllRight">所拥有的总权限</param>
  /// <param name="iCurrRight">当前要验证的权限</param>
  /// <returns></returns>
  public static bool ValidateRight( int iAllRight,int iCurrRight )
  {
   if ( iAllRight == (iAllRight | iCurrRight) )
    return true;

   return false;
  }

  /// <summary>
  /// 验证权限
  /// </summary>
  /// <param name="iAllRights"></param>
  /// <param name="iCurrRight"></param>
  /// <returns></returns>
  public static bool ValidateRight( int[] iAllRights,int iCurrRight )
  {
   if( null == iAllRights || 0 == iAllRights.Length )
    return false;
   
   int iTemp = UniteRight( iAllRights );

   if ( iTemp == (iTemp | iCurrRight) )
    return true;

   return false;
  }

  /// <summary>
  /// 父子权限合并
  /// </summary>
  /// <param name="iRights"></param>
  /// <returns></returns>
  public static int UniteRight( int[] iRights )
  {
   if( null == iRights || 0 == iRights.Length )
    return 0;

   int iTemp = 0;

   foreach( int iRight in iRights)
   {
    iTemp |= iRight;
   }
   
   return iTemp;
  }
 }
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

honkerhero

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值