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.
非常感謝Jon的寶貴意見。循環邏輯真的縮短了我的代碼。你首先評論填充。由於我不知道什麼長度將是位串的字符串我認爲添加或切斷位的方法應該在那裏。雖然我可以添加一個參數,要求用來決定兩個選項中的任何一個。寫入控制檯只是爲了檢查輸出,因爲它使用控制檯應用程序進行測試。 – 2010-01-04 04:28:00
另外,如果你能解釋爲什麼在代碼中有異常是錯誤的。我想在這裏做的是,如果事情正常工作,那麼它會返回基於32格式的字符串。如果incase有問題並引發異常,我會返回一個空字符串,並可以添加一個顯示異常詳細信息的消息框。這會是錯誤的方法嗎? – 2010-01-04 04:32:20
@Kavitesh:關鍵是在編碼的時候,你會*知道字符串的長度 - 所以你可以使用填充來確保你總是以最後一個字符結尾。看看base64如何使用填充作爲例子。至於例外:這是一個相對較低的程序。它不應該就如何處理異常做出決定。這取決於調用應用程序 - 幾乎可以肯定不應該僅僅捕獲「Exception」,除了最高級別。通常情況下,堆棧中的任何東西都應該捕獲特定的異常,它可以真正處理*。 – 2010-01-04 06:24:34