2010-08-08 110 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,但以这种形式它更容易理解。

相关问题