比較基礎的東西,平時用的不多,真到碰到時卻不會用了,下面是整理的一些資料
int類型即Int32, 由4個位元組32位表示,高第31位(編號從零開始)用來表示正負,1為負數,0為正數 (左表示高位,右表示低)
int 類型的負數是採用補碼來表示的,即在對應的int類型正數上按位求反後再加1
比方計算-1,其正數為 0000000...001(31個零跟一個1) 那麼按位求反後應該是 111111111....10 ,再加1的結果是11111111...111(32個1).
long類型跟int類似,只不過long由8位元組64位表示
資料轉換常用代碼
//將16進位數0XFFFFFFFF轉換為整數(Int32)
MessageBox.Show( Convert.ToInt32("FFFFFFFF", 16).ToString()); //顯示 -1
//將2進位數11111111轉換為整數(Int32),注意11111111 等效於 0000...00011111111 (前面24個零)
MessageBox.Show(Convert.ToInt32("11111111",2).ToString());// 顯示 255
//將整數-1轉換成2進位字串
MessageBox.Show(Convert.ToString(-1, 2)); // -1的二進位表示,顯示11111....11 (32個1)
//將整數-1轉換成16進位字串
MessageBox.Show(Convert.ToString(-1, 16)); // -1的16進位表示,顯示FFFFFFFF
使用BitConverter
byte[] bytes = new byte[] { 0xFF, 0xFF, 0xFF, 0xFF,0 ,0};
//取bytes資料的第0個到第3個元素(int類型有4個位元組) ,轉化成整數
MessageBox.Show( BitConverter.ToInt32(bytes, 0).ToString()); //顯示 -1;
//將byte[] 數組表示成十六進位字串序列,各元素轉化後用 "-"串連,順序不變
MessageBox.Show( BitConverter.ToString(bytes)); //顯示 FF-FF-FF-FF-0-0
//擷取10(Int32)的位元組數組
byte[] arr=BitConverter.GetBytes(10); //產生的數組為 {10,0,0,0}
MessageBox.Show(BintConverter.ToString(arr)); //顯示為0A-0-0-0;
這裡注意10的Int32記憶體表示方法是 00-00-00-0A(高位元組左邊低位元組在右邊) ,而上面的是通過BinConverter轉化後是高位元組在右邊低位元組在左邊.
使用位操作
在開發一些帶許可權控制的功能時我們有可能用到位操作,
比方系統中有一些資源,每個資源對應一組操作,假設有8種操作
這個時候你就可以設計這麼一張表
資源使用者動作表(使用者名稱,資源號,操作類型)
一些資料:
tools 1, 1
tools 2, 2
tools 1 , 3
alsve 3, 1
alsve 1,2
在上面我們用數字1~8表示8種操作,顯然如果一個使用者對某一資源擁有全部許可權的話就需要8條記錄來表示,如果使用者達到幾十萬層級時這個表的資料量將會很龐大.
改用位來表示操作
資源使用者動作表(使用者名稱,資源號,運算元)
這裡我們使用了運算元,他是int類型的整數 我們使用其低8位來表示某使用者對某資源擁有操作,對應位為1則表示有相應許可權,為零則表示沒有.
在上面的規則下我們需要用到以下操作
1.判斷某一位是否為1 即使用者是否擁有某資源的某一操作,
bool運算式 (運算元 & (1<< 位置)) > 0;
2.設定某一位為1,即將某一資源的某一操作分配給使用者
運算元=運算元 | (1<<位置);
3. 設定某一位為0,即將使用者對某一資源的某一操作取消
運算元=運算元 & (~(1<<位置)); //移位後,按位求反,再與運算元做與操作
一些實現細節
使用者登入後一次性將使用者的資源操作資料載入到 Hashtable裡(包括使用者屬於的角色指派的資源操作資料)
代碼類似如下:
foreach(...){
hash.Add("資源號","運算元") ;
}
當然使用者會屬於一些角色的,而給角色指派的資源操作可能跟給使用者指派的資源操作重疊,
這個時候就需要將2者合并, 修改後的代碼類似如下
foreach(....){
if (hash.ContainsKey("資源號"))
{
hash["資源號"] = (int)hash["資源號"] | "運算元";
}
else
{
hash.Add("資源號", "運算元");
}
}
Hashtable可以方便的序列化,序列化後的資料可以儲存在 Session(使用SQL儲存Session)或者儲存在加密的ViewState裡面,當然同樣可以把ViewState儲存到SQL伺服器裡,不過,使用SQL Session 比較方便