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