Converter uma representação de seqüência binária em uma matriz de bytes

Como você converter uma seqüência de caracteres como “01110100011001010111001101110100” para uma matriz de bytes, em seguida, usou File.WriteAllBytes tal que a seqüência binária exata é o binário do arquivo. Neste caso, seria o texto “teste”.

Caso você não tenha esse fetiche LINQ, tão comum ultimamente, você pode tentar o caminho normal

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

O LINQ é ótimo, mas deve haver alguns limites.

Você poderia começar dividindo a string em uma sequência de strings de 8 caracteres, depois converter essas strings em bytes e, eventualmente, gravar os bytes em um arquivo.

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

EDIT: aqui está outra maneira de dividir a string em pedaços de 8 caracteres, talvez um pouco mais simples:

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

Se você sabe que o comprimento da string é um múltiplo de 8, você pode simplificar ainda mais:

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

Um pouco atrasado, mas aqui estão meus 2 centavos:

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

Na verdade, a resposta de @Maciej não está correta. Como @ Phate01 notou que o numOfBytes está correto apenas para comprimento de input que é uma potência de 8 . A segunda coisa é que a matriz de bytes deve ser preenchida de n para 0 e não para o contrário. Aqui está o exemplo de código:

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

Isso pode ser melhorado para se livrar do stat, mas desta forma é mais compreensível.

As outras respostas te cobrem, mas só por diversão eu escrevi o contrário. Indo da string para a representação binária 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; }