2012-01-24 3 views
3

"0100110011001"과 같은 문자열이 있습니다. 배열에 0과 1이 들어있는 바이트 배열로 변환하고 싶습니다. 변환 후에 배열에 49, 48이 들어 있습니다. 나는 다음 코드를 사용하여 예를 들어 많은 인코딩을 시도하고, 그런 일이 왜문자열에서 바이트 이상한 동작으로 변환

System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding(); 
      byte result = encoding.GetBytes(str); 

어떤 생각, 어떻게 내가 원하는

답변

2

48은 0의 ASCII 코드이며 49는 1의 ASCII 코드입니다.이 문자열의 변환을 수행 할 수있는 여러 가지 방법이 있지만 사용자가 직접 관리 할 수있을만큼 충분해야합니다. 행운을 빕니다 :)

가능한 해결 방법 : 한 라인 LINQ 문 (내가이 솔루션을 추천하지 않는 것이)으로

public static class StringExtensions 
    { 
     public static byte[] ToByteArray(this string str) 
     { 
      char[] arr = str.ToCharArray(); 
      byte[] byteArr = new byte[arr.Length]; 

      for (int i=0; i<arr.Length; ++i) 
      { 
       switch (arr[i]) 
       { 
        case '0': byteArr[i] = 0; break; 
        case '1': byteArr[i] = 1; break; 
        default: throw new Exception(arr[i]+" is not 0 or 1."); 
       } 
      } 

      return byteArr; 
     } 
    } 
+0

왜 둘 다'char []'를 시작하는 것입니까? 문자열에 색인을 지정하기 만하면됩니다. –

+0

네 말이 맞아, 존. 전에 그렇게 한 것을 기억합니다. 나는 왜 이번에 char 배열을 생성하기로 결정했는지 모른다. –

8

을 출력을 달성하기 위해 당신은 텍스트를 요구하고있는 인코딩 유형을 변경 한 이유 UTF-8을 사용하여 인코딩 할 '0'및 '1'문자를 인코딩합니다. UTF-8에서 '0'은 48 바이트로 표시되고 '1'은 49 바이트로 표시됩니다. 비 ASCII 문자는 여러 바이트로 표시됩니다.

정말 바이너리 파서가 필요합니다. - 당신은 하나의 바이트에 Convert.ToByte(text, 2)을 사용할 수 있지만 프레임 워크에 임의의 길이의 문자열을 바이너리로 파싱하여 바이트 배열로 변환하는 것이 무엇인지 확실하지 않습니다. 그래도 할 수있는 써드 파티 루틴이 많이 있습니다. 어렵지 않습니다.

그것은 원래의 코드가 있지만 작동하지 않는 이유를 이해 매우 중요합니다 -에 대한 정말 무엇 Encoding.GetBytes.

+0

은 내가 당신이라면 나는 연장을 작성합니다 바이트 배열 – AMH

+0

에 문자열을 분할하는 LINQ를 사용할 수 있습니다. 내 대답을 확인해. –

+0

+2 for _It는 Encoding.GetBytes가 실제로 for_ 인 이유에 대해 원래 코드가 작동하지 않는 이유를 이해하는 것이 매우 중요합니다! – Nailuj

2

.

public static byte[] ToByteArray(this string source) 
{ 
    return 
     Regex.Matches(source.PadLeft(source.Length + source.Length % 8, '0'), "[01]{0,8}") 
     .Cast<Match>() 
     .Where(m => m.Success && !String.IsNullOrWhiteSpace(m.Groups[0].Value)) 
     .Select(m => Convert.ToByte(m.Groups[0].Value, 2)) 
     .ToArray(); 
} 
관련 문제