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; } }}