2010-01-01 4 views
0

사용자 정의 base32 인코딩 문자열로 비트 배열을 인코딩하려면 다음 코드를 작성해야합니다. 내 생각은 사용자가 요구 사항에 따라 base32 배열의 순서를 섞어서 I 및 1 등의 유사한 문자를 추가 할 수 있다는 것입니다.사용자 정의 Base32 인코딩 코드 C#

질문의 의도는 : 적절한 방식으로 작성되었거나 일부가 부족합니다. 기초. 늘어나는만큼 내가 requirment 당 출력을 생성 알고 있지만, 나는 단지 코드를 여기에 유효성을 검사하고 싶습니다. 결함이 있으면 알려주세요.

사용자는 base32로 인코딩되어야하는 문자열을 갖게됩니다. 따라서 그의 기능에서 그는 이것을 이렇게 부릅니다. 난 5의 다수의 라운드 비트를 잘라 것 또는 여러하도록 추가 제로 값의 비트를 추가 할 위치를 I 두 옵션을 유지 한

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; 
    } 
} 

아래로

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

이제 GenerateBase32FromString은 5.

답변

2

몇 가지 제안 : 당신은 "패딩"의 어떤 생각이없는

  • - 그래서 당신은 할 수 없습니다
  • 매개 변수로 키 문자를 메서드에 전달합니다. 당신이
  • 모두 StringBuilder를 시작하거나 올바른 길이의 문자 배열을 만들고 Exception 거의이다 잡는 그
  • 에서 직접 문자열을 만들 수있는 능력을 제공 하나를하려는 경우 하나 "기본"에 대한 과부하를 가질 수 있습니다 항상 나쁜 아이디어이며, 확실히 여기 있습니다. 모든 예외는이 코드의 버그로 인한 것이므로 스택 위로 버블 링하게하십시오.
  • "true"와의 비교는 항상 나에게 악의적 인 것처럼 보입니다. 개인적으로는/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

또한 코드에서 예외가 발생하는 이유를 설명 할 수 있습니다. 내가 뭘하려고하는지 일들이 정상적으로 작동한다면 그것은 기본 32 형식의 문자열을 반환합니다. 몇 가지 문제가 발생하고 예외가 발생하면 null 문자열을 반환하고 예외 세부 정보를 표시하는 messagebox를 추가 할 수 있습니다. 그것이 잘못된 접근일까요? –

+0

@Kavitesh : 요점은 인코딩 시점에서 문자열의 길이를 알기 때문에 패딩을 사용하여 항상 라운드 수의 문자로 끝나도록 할 수 있습니다. base64가 패딩을 사용하는 방법을 예제로 살펴보십시오. 예외적으로 이것은 비교적 낮은 수준의 루틴입니다. 예외 처리 방법에 대한 결정을 내려서는 안됩니다. 호출 응용 프로그램에 달려 있습니다. 최상위 수준을 제외하고는 거의 "예외"를 잡아서는 안됩니다. 일반적으로 스택 아래쪽에있는 것은 예외 처리를 할 수밖에 없다. –