2010-01-01 63 views
0

我已經編寫了下面的代碼,將一個bitarray編碼爲自定義的base32編碼字符串。我的想法是用戶可以根據需要混合使用base32陣列的順序,並可以添加類似的外觀,如I和1等。Custom Base32編碼代碼C#

我問這個問題的意圖是:代碼是以適當的方式編寫還是缺少一些基本。據我所知它是根據需求生成輸出,但是我想在這裏驗證代碼。如果有缺陷,請告訴我。

用戶將有一個需要base32編碼的字符串。所以在他的功能中,他會這樣稱呼它。

BitArray ba = new BitArray(Encoding.UTF8.GetBytes(CustomString)); 
GenerateBase32FromString(ba); 

現在GenerateBase32FromString是如下

static string GenerateStringFromKey(BitArray ba) 
{ 
    try 
    { 
     // user will modify the order as per requirement. 
     char[] cProdKeyPoss = "ABGCD1EF2HI3KL4MN5PQ6RS7TV8WX9YZ".ToCharArray(); 
     StringBuilder finalstring = new StringBuilder(); 
     // add zero value bits to round off to multiple of 5 
     //ba.Length = ba.Length + (5-(ba.Length % 5)); 
     // remove bits to round off to multiple of 5 
     ba.Length = ba.Length - (ba.Length % 5); 
     Console.WriteLine("ba.length = " + ba.Length.ToString()); 

     for (int i = 0; i < ba.Length; i = i + 5) 
     { 
      int[] bitvalue = { 0, 0, 0, 0, 0 }; 

      if (ba.Get(i) == true) 
       bitvalue[0] = 1; 

      if (ba.Get(i + 1) == true) 
       bitvalue[1] = 1; 

      if (ba.Get(i + 2) == true) 
       bitvalue[2] = 1; 

      if (ba.Get(i + 3) == true) 
       bitvalue[3] = 1; 

      if (ba.Get(i + 4) == true) 
       bitvalue[4] = 1; 

      int temp = (16 * bitvalue[0]) + (8 * bitvalue[1]) + (4 * bitvalue[2]) + (2 * bitvalue[3]) + (bitvalue[4]); 
      finalstring.Append(cProdKeyPoss[temp].ToString()); 
     } 
     Console.WriteLine(finalstring.ToString()); 
     return finalstring.ToString(); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
     return null; 
    } 
} 

我一直保持這兩個選項在那裏我將比特砍來一輪的5倍數或將增加額外的零值位,使其多5.

回答

2

幾點建議:

  • 你沒有的「填充」任何想法 - 所以你不能
  • 將關鍵字符作爲參數傳遞給方法。你可以有一個「默認」的一個過載,如果你想
  • 要麼給StringBuilder的下手,或創造合適長度的字符數組,並直接從該
  • 追趕Exception幾乎是建立一個字符串的容量總是一個壞主意,而且它肯定是在這裏。任何異常都是由於這段代碼中的一個錯誤引起的,所以只是讓它冒出來堆積起來
  • 與「true」的比較總是讓我看起來很臭,而且我親自把if/for/while /即使是單語句,所以我會

    if (ba.Get(i)) 
    { 
        bitValue[0] = 1; 
    } 
    
  • 有在具有位陣列開始,沒有真正的點。爲什麼不添加一個從0開始的值?

    if (ba.Get(i)) 
    { 
        temp += 16; 
    } 
    // etc 
    
  • 這樣重複的代碼表明一個循環:

    int temp = 0; 
    for (int j = 0; j < 5; j++) 
    { 
        if (ba.Get(i + j)) 
        { 
         // This could just be "1 << j" if you don't mind the 
         // results being different to your current code 
         temp += 1 << (4 - j); 
        } 
    } 
    
  • 庫方法不應該寫入控制檯
  • 不要叫ToString,當你有正確的特點 - 請撥打Append(char)(或在結果字符數組中設置值)。
+0

非常感謝Jon的寶貴意見。循環邏輯真的縮短了我的代碼。你首先評論填充。由於我不知道什麼長度將是位串的字符串我認爲添加或切斷位的方法應該在那裏。雖然我可以添加一個參數,要求用來決定兩個選項中的任何一個。寫入控制檯只是爲了檢查輸出,因爲它使用控制檯應用程序進行測試。 – 2010-01-04 04:28:00

+0

另外,如果你能解釋爲什麼在代碼中有異常是錯誤的。我想在這裏做的是,如果事情正常工作,那麼它會返回基於32格式的字符串。如果incase有問題並引發異常,我會返回一個空字符串,並可以添加一個顯示異常詳細信息的消息框。這會是錯誤的方法嗎? – 2010-01-04 04:32:20

+0

@Kavitesh:關鍵是在編碼的時候,你會*知道字符串的長度 - 所以你可以使用填充來確保你總是以最後一個字符結尾。看看base64如何使用填充作爲例子。至於例外:這是一個相對較低的程序。它不應該就如何處理異常做出決定。這取決於調用應用程序 - 幾乎可以肯定不應該僅僅捕獲「Exception」,除了最高級別。通常情況下,堆棧中的任何東西都應該捕獲特定的異常,它可以真正處理*。 – 2010-01-04 06:24:34