2010-01-01 2 views
0

Я написал следующий код для кодирования 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.

ответ

2

несколько предложений:

  • вы не имеют ни малейшего представления о «дополнения» - так что вы не можете
  • Передайте ключевые символы в качестве параметра для метода. Вы можете иметь перегрузку для «по умолчанию», если вы хотите
  • дать либо StringBuilder емкость, чтобы начать с, или создать обугленного массив нужной длины и создать строку непосредственно из этого
  • Ловля Exception почти всегда плохая идея, и это, безусловно, здесь. Любое исключение было бы связано с ошибкой в ​​этом коде, поэтому просто позвольте этому пузыриться в стеке
  • Сравнение с «истинным» всегда выглядит вонючим ко мне, и я лично ставил if/for/while/etc в телах блоков даже для отдельных операторов, так что я бы

    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) (или установите значение в массиве char результата).
+0

Спасибо Jon за ценные комментарии. Логика цикла действительно сократила мой код. Вы впервые отметили прописку. Поскольку я не знал бы, какая длина будет строкой в ​​терминах битов, я думал, что подход добавления или измельчения бит должен быть там. Хотя я могу добавить аргумент с просьбой использовать один из двух вариантов. Запись на консоль заключалась в том, чтобы просто проверить выход, поскольку использовала консольное приложение для тестирования. –

+0

Также, если вы могли бы объяснить, почему исключение в коде неверно. То, что я пытаюсь сделать здесь, - если все работает нормально, то оно вернет строку в формате base-32. Если incase возникает какая-то проблема, и возникает исключение, я бы возвращал пустую строку и мог добавить окно сообщений, в котором указаны данные об исключении. Это будет неправильный подход? –

+0

@ Kavitesh: Дело в том, что в точке кодирования вы * умеете * знать длину строки, поэтому вы можете использовать отступы, чтобы всегда быть круглым числом символов. Посмотрите, как в качестве примера используется base64 для base64. Что касается исключения: это процедура с относительно низким уровнем. Он не должен принимать решение о том, как обрабатывается исключение. Это зависит от вызывающего приложения, которое почти наверняка не должно просто ловить «исключение», кроме самого верхнего уровня. Обычно все, что находится внизу стека, должно ловить только определенные исключения, которые он может действительно * обрабатывать *. –

Смежные вопросы