将二进制string表示转换为字节数组

如何将string(如“01110100011001010111001101110100”)转换为字节数组,然后使用File.WriteAllBytes,使得确切的二进制string是文件的二进制文件。 在这种情况下,它将是文本“testing”。

如果你没有这个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是伟大的,但必须有一些限制。

您可以先将string拆分为8个字符的string序列,然后将这些string转换为字节,最后将字节写入文件

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

编辑:这里的另一种方法将string拆分为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))); 

如果你知道string的长度是8的倍数,你可以使它更简单:

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

有点晚了,但这是我的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); 

其他的答案已经涵盖了,但只是为了好玩,我写的是相反的。 从string到ascii二进制表示forms:

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

其实@Maciej的答案是不正确的。 由于@ Phate01注意到numOfBytes只对input长度是正确的,这是8的幂。 第二件事是字节数组应该从n0索引而不是相反的方式。 这是代码示例:

 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语句,但在这种forms是更容易理解。