2010-08-08 152 views
24

如何將諸如「01110100011001010111001101110100」之類的字符串轉換爲字節數組,然後使用File.WriteAllBytes使得確切的二進制字符串是文件的二進制文件。在這種情況下,它將是文本「測試」。將二進制字符串表示轉換爲字節數組

+0

下面是一個很好的開始:http://msdn.microsoft.com/en-us/library/system.convert_methods.aspx – NullUserException 2010-08-08 23:02:13

回答

29

如果你沒有這個LINQ神物,所以最近常見,你可以嘗試以正常的方式

string input .... 
int numOfBytes = input.Length/8; 
byte[] bytes = new byte[numOfBytes]; 
for(int i = 0; i < numOfBytes; ++i) 
{ 
    bytes[i] = Convert.ToByte(input.Substring(8 * i, 8), 2); 
} 
File.WriteAllBytes(fileName, bytes); 

LINQ是偉大的,但有必須有一定的限制。

+0

更容易理解 – jwsample 2010-08-08 23:27:11

+1

這假定字符串長度是8的倍數......但是你是對的,這可能更容易理解。我想我完全沉迷於LINQ;) – 2010-08-08 23:30:06

+2

嗯。我認爲LINQ更易於理解。它簡潔地描述了在不描述實現該目標的(嘈雜)步驟的情況下做了什麼。它具有更高的內容噪聲比。 – spender 2010-08-09 00:04:11

9

你可以通過分割線劃分成8個字符的字符串序列展開,然後將這些字符串轉換爲字節,並最終寫入的字節文件

string input = "01110100011001010111001101110100"; 
var bytesAsStrings = 
    input.Select((c, i) => new { Char = c, Index = i }) 
     .GroupBy(x => x.Index/8) 
     .Select(g => new string(g.Select(x => x.Char).ToArray())); 
byte[] bytes = bytesAsStrings.Select(s => Convert.ToByte(s, 2)).ToArray(); 
File.WriteAllBytes(fileName, bytes); 

編輯:這裏是另一種方式字符串分割爲8個字符的塊,也許有點簡單:

int nBytes = (int)Math.Ceiling(input.Length/8m); 
var bytesAsStrings = 
    Enumerable.Range(0, nBytes) 
       .Select(i => input.Substring(8 * i, Math.Min(8, input.Length - 8 * i))); 

如果您知道該字符串的長度爲8的倍數,可以使其更簡單:

int nBytes = input.Length/8; 
var bytesAsStrings = 
    Enumerable.Range(0, nBytes) 
       .Select(i => input.Substring(8 * i, 8)); 
+0

剛碰到這個問題。一個很好的玩具問題...適合面試。在閱讀答案之前,我想我會試一試。匹配你的第二種方法實際上任期的術語。我也沉迷於LINQ! +1 – spender 2010-08-09 00:06:50

0

其他答案你有覆蓋,但只是爲了好玩,我寫了相反的。從字符串要去ASCII二進制表示:

private static string StringToAsciiBin(string s) 
    { 
     string output = ""; 
     foreach (char c in s.ToCharArray()) 
     { 
      for (int i = 128; i >= 1; i /=2) 
      { 
       if (((int)c & i) > 0) 
       { 
        output += "1"; 
       } 
       else 
       { 
        output += "0"; 
       } 
      } 
     } 
     return output; 
    } 
+2

你會想從一個字節數組轉到二進制表示。字符是一個16位的數據類型,所以你會砍掉每個字符代碼的前八位。另外,不要使用+ =來構建一個字符串,它的縮放非常糟糕,而是使用StringBuilder。 – Guffa 2010-08-08 23:36:35

3

晚了一點,但這裏是我的2美分:

var binaryStr = "01110100011001010111001101110100"; 

var byteArray = Enumerable.Range(0, int.MaxValue/8) 
          .Select(i => i*8) 
          .TakeWhile(i => i < binaryStr.Length) 
          .Select(i => binaryStr.Substring(i, 8)) 
          .Select(s => Convert.ToByte(s, 2)) 
          .ToArray(); 
File.WriteAllBytes("C:\temp\test.txt", byteArray); 
0

實際@Maciej的答案是不正確的。由於@ Phate01注意到numOfBytes僅適用於輸入長度爲8的功率。第二件事是字節數組應該從n填充到0索引不是相反的方式。下面的代碼示例:

var bits = "000011110000001000"; 
var numOfBytes = (int)Math.Ceiling(bits.Length/8m); 
var bytes = new byte[numOfBytes]; 
var chunkSize = 8; 

for (int i = 1; i <= numOfBytes; i++) 
{ 
    var startIndex = bits.Length - 8 * i; 
    if (startIndex < 0) 
    { 
     chunkSize = 8 + startIndex; 
     startIndex = 0; 
    } 
    bytes[numOfBytes - i] = Convert.ToByte(bits.Substring(startIndex, chunkSize), 2); 
} 

這可以提高擺脫if statetment,但以這種形式它更容易理解。

相關問題