Преобразование двоичного строкового представления в массив байтов

Как вы преобразовываете строку, такую ​​как «01110100011001010111001101110100» в массив байтов, а затем использовали File.WriteAllBytes, так что точная двоичная строка является двоичным файлом файла. В этом случае это будет текст «тест».

Если у вас нет этого фетиша 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 отлично, но должны быть некоторые ограничения.

Вы можете начать с разбиения строки на последовательность из 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); 

EDIT: вот еще один способ разделить строку на 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)); 

Немного поздно, но вот мои 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); 

На самом деле ответ от @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); } 

Это можно улучшить, чтобы избавиться от stat, но в этой форме это более понятно.

Другие ответы вы освещали, но просто для удовольствия я написал обратное. Переход от строки к двоичному представлению 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; } 
  • Можно ли использовать бинарный литерал в C или C ++?
  • Включить двоичный файл с помощью скрипта GNU ld linker
  • Эффективно конвертировать между шестнадцатеричными, двоичными и десятичными в C / C ++
  • Количество отсчетов 1 в двоичном представлении
  • Java: Синтаксис и смысл за «[B @ 1ef9157»? Binary / адрес?
  • Чтение двоичных данных из std :: cin
  • Почему мы используем Base64?
  • Преобразование строки из 1s и 0s в двоичное значение
  • Определение типа двоичного / текстового файла в Java?
  • Как определить, является ли файл двоичным или текстовым в c #?
  • Как печатать двоичный номер через printf
  • Давайте будем гением компьютера.