Я написал следующий код для кодирования bitarray в пользовательскую строку кодировки base32. Моя идея заключается в том, что пользователь может смешать порядок массива base32 в соответствии с требованиями и может добавлять похожие символы, такие как I и 1 и т. Д.Пользовательский код кодировки 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 за ценные комментарии. Логика цикла действительно сократила мой код. Вы впервые отметили прописку. Поскольку я не знал бы, какая длина будет строкой в терминах битов, я думал, что подход добавления или измельчения бит должен быть там. Хотя я могу добавить аргумент с просьбой использовать один из двух вариантов. Запись на консоль заключалась в том, чтобы просто проверить выход, поскольку использовала консольное приложение для тестирования. –
Также, если вы могли бы объяснить, почему исключение в коде неверно. То, что я пытаюсь сделать здесь, - если все работает нормально, то оно вернет строку в формате base-32. Если incase возникает какая-то проблема, и возникает исключение, я бы возвращал пустую строку и мог добавить окно сообщений, в котором указаны данные об исключении. Это будет неправильный подход? –
@ Kavitesh: Дело в том, что в точке кодирования вы * умеете * знать длину строки, поэтому вы можете использовать отступы, чтобы всегда быть круглым числом символов. Посмотрите, как в качестве примера используется base64 для base64. Что касается исключения: это процедура с относительно низким уровнем. Он не должен принимать решение о том, как обрабатывается исключение. Это зависит от вызывающего приложения, которое почти наверняка не должно просто ловить «исключение», кроме самого верхнего уровня. Обычно все, что находится внизу стека, должно ловить только определенные исключения, которые он может действительно * обрабатывать *. –