Convierta una representación de cadena binaria a una matriz de bytes

¿Cómo se convierte una cadena como “01110100011001010111001101110100” a una matriz de bytes y luego se utiliza File.WriteAllBytes de manera que la cadena binaria exacta es el binario del archivo. En este caso, sería el texto “prueba”.

En caso de que no tengas este fetiche de LINQ, tan común últimamente, puedes intentarlo de la manera 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); 

LINQ es genial, pero debe haber algunos límites.

Puede comenzar dividiendo la cadena en una secuencia de cadenas de 8 caracteres, luego convierta esas cadenas en bytes y eventualmente escriba los bytes en un archivo

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

EDITAR: aquí hay otra manera de dividir la cadena en trozos de 8 caracteres, quizás un poco más simple:

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

Si sabes que la longitud de la cadena es un múltiplo de 8, puedes hacerlo aún más simple:

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

Un poco tarde, pero aquí están mis 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); 

En realidad, la respuesta de @Maciej no es correcta. Como @ Phate01 notó que el numOfBytes es correcto solo para la longitud de entrada que es una potencia de 8 . Lo segundo es que la matriz de bytes debe estar poblada de n a 0 no en el sentido opuesto. Aquí está el ejemplo del 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); } 

Esto se puede mejorar para deshacerse del enunciado if pero de esta forma es más comprensible.

Las otras respuestas lo tienen cubierto, pero solo por diversión escribí lo contrario. Pasando de la cadena a la representación binaria 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; }