2016-12-12 3 views
2

Это немного странная проблема, которую я имею здесь. Я работаю с C# 6 на платформе .NET по алгоритму двоичного сжатия. Несколько ступеней сжатия работают отлично, даже намного лучше, чем ожидалось! Однако преобразование неоптимизированного двоичного файла обратно в файл оказывается немного больнее, чем я ожидал.Могу ли я записать двоичный файл, хранящийся в виде строки, в двоичный файл непосредственно на C#?

Дело

Binary считывается из произвольного файла, и передается вместе в программе в виде строки. Несколько строк оптимизации работают над строкой, преобразуя ее в промежуточное представление, которое записывается как сжатый объект. Затем деоптимизация превращает промежуточную форму обратно в чистую двоичную, готовую к записи.

Кодекс

Двоичный вход

BinaryString = ""; Filename = filename; 
StringBuilder sb = new StringBuilder(); 
foreach(byte b in File.ReadAllBytes(filename)) { 
{ 
    sb.Append(Convert.ToString(b, 2).PadLeft(8, '0')); 
} 
BinaryString = sb.ToString(); 

Это, как я принимать входной сигнал. Он вернет буквальную двоичную строку в виде 11001010110001

Преобразование из его промежуточной формы возвращает точно такую ​​же строку.

Binary

Выход В настоящее время я пытаюсь напрямую записать двоичный файл в байтах, как таковой:

List<Byte> bytes = new List<byte>(); 
foreach(char c in binary) 
    bytes.Add(Convert.ToByte(c)); 
File.WriteAllBytes(filename, bytes.ToArray()); 

Проблема

Метод, который я пытаюсь прямо сейчас двоичный вывод просто записывает двоичный файл в текстовый файл, а не записывает двоичный объект в файловую систему.

Мы сжимаем картинки, исполняемые файлы, текст, объекты git и т. Д. Поэтому совершенно очевидно, что это так написано.

Существует ли метод в C# /. NET, который легко позволит мне перевести двоичный файл обратно в файл, или это более сложная проблема, чем я думаю?

+4

Почему в мире вы бы превратили двоичные данные в строку в первую очередь вместо того, чтобы просто обрабатывать данные как байты? – itsme86

+0

^^ см. Комментарий выше –

+0

Двоичные данные обычно имеют формат, связанный с данными. Вы просто не можете прочитать о записи данных. Например, если вы пишете 32-битное целое число, два 8-битных байта. Когда вы читаете, вы должны читать данные в тех же размерах. Поэтому, когда вы пишете двоичный файл, вы должны прочитать его точно так же, как это было написано. – jdweng

ответ

2

Есть 8 бит в байте, но вы пытаетесь преобразовать 1 бит за один раз в байт. Вы должны собрать 8 бит, а затем преобразовать его в байт, используя Convert.ToByte() перегрузку, которая принимает fromBase:

Заменить этот код:

// Note: I assume you meant to reference `BinaryString` here 
// and not "binary" which isn't defined in your example 
foreach(char c in BinaryString) 
    bytes.Add(Convert.ToByte(c)); 

С этим:

var thisByte = string.Empty; 
foreach (char c in BinaryString) 
{ 
    thisByte += c; 
    if (thisByte.Length == 8) 
    { 
     bytes.Add(Convert.ToByte(thisByte, 2)); 
     thisByte = string.Empty; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^