2012-01-24 84 views
3

我有這樣的字符串「0100110011001」我想將它轉換爲字節數組,使得數組包含零和1轉換後數組包含49,48的問題我不爲什麼我試圖例如我用下面的代碼多種編碼,並改變了編碼類型從字符串轉換爲字節奇怪的行爲

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

任何想法,爲什麼這種情況發生,以及如何實現輸出我的願望

回答

2

48是ASCII代碼0和49是ASCII代碼1.有很多方法可以執行此字符串的轉換,但這應該足以讓您自行管理。祝你好運:)

可能的解決辦法:

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

你問文本字符'0'和'1'使用UTF-8進行編碼。在UTF-8中,'0'用字節48表示,'1'用字節49表示。(非ASCII字符用多個字節表示)。

聽起來你真的想要一個二進制解析器 - 您可以使用Convert.ToByte(text, 2)作爲單個字節,但我不確定框架中是否有任何內容將任意長度的字符串解析爲二進制數據,從而將其轉換爲字節數組。我敢肯定,網絡上有很多第三方例程可以實現它 - 這並不難。

這是非常重要的,你明白爲什麼你原來的代碼沒有工作,雖然 - 什麼是Encoding.GetBytes真的

+0

我可以使用LINQ將字符串分成字節數組 – AMH

+0

如果我是你,我會寫一個擴展名。檢查我的答案。 –

+0

+2 for _It非常重要的是,你明白了爲什麼你的原始代碼沒有工作,但 - Encoding.GetBytes真的是for_! – Nailuj

2

這樣一行LINQ語句(不,我會建議這個解決方案)。

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