2016-12-12 3 views
2

Dies ist ein bisschen ein seltsames Problem, das ich hier habe. Ich arbeite mit C# 6 auf der .NET-Plattform auf einem binären Komprimierungsalgorithmus. Mehrere Kompressionsstufen funktionieren gut, sogar viel besser als erwartet! Die Konvertierung der nicht optimierten Binärdatei in eine Datei erweist sich jedoch als etwas problematischer, als ich erwartet hatte.Kann ich Binärdaten, die als Zeichenfolge gespeichert sind, direkt in C# in eine Binärdatei schreiben?

Der Fall

Binary wird aus einer beliebigen Datei gelesen wird, und entlang innerhalb des Programms als String übergeben. Mehrere Optimierungswellen arbeiten an der Zeichenfolge und wandeln sie in eine Zwischendarstellung um, die als komprimiertes Objekt geschrieben wird. Dann macht die De-Optimierung die Zwischenform zurück in eine reine Binärdatei, die bereit ist geschrieben zu werden.

Der Kodex

Binäreingangsmodul

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

Dies ist, wie ich Eingabe akzeptieren werde. Es wird eine literale binäre Zeichenfolge in Form von 11001010110001

zurückgegeben. Die Konvertierung von seiner Intermeidate-Form gibt genau dieselbe Zeichenfolge zurück.

Binary

Output Derzeit bin ich versucht, eine binäre Datei als Byte direkt zu schreiben, als solche:

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

Das Problem

Die Methode, die ich bin in diesem Augenblick versuchen, für Die binäre Ausgabe schreibt einfach das binäre Outright in eine Textdatei, anstatt ein binäres Objekt in das Dateisystem zu schreiben.

Wir komprimieren Bilder, ausführbare Dateien, Text, Git Objekte usw. Es ist also offensichtlich nicht möglich, es so zu schreiben.

Gibt es eine Methode in C# /. NET, die mich leicht die Binär zurück in eine Datei übersetzen lässt, oder ist das ein komplizierteres Problem als ich denke?

+4

Warum in der Welt würden Sie die binären Daten in erster Linie in einen String umwandeln, anstatt nur die Daten als Bytes zu behandeln? – itsme86

+0

^^ siehe Kommentar oben –

+0

Binärdaten haben normalerweise ein Format, das den Daten zugeordnet ist. Sie können einfach nicht lesen von den Daten schreiben. Zum Beispiel, wenn Sie eine 32-Bit-Ganzzahl schreiben, zwei 8-Bit-Bytes. Wenn Sie lesen, müssen Sie die Daten in den gleichen Größen lesen. Wenn du also binär schreibst, musst du es genau so lesen, wie es geschrieben wurde. – jdweng

Antwort

2

Es gibt 8 Bits in einem Byte, aber Sie versuchen, jeweils 1 Bit in ein Byte umzuwandeln. Sie müssen zuerst 8 Bits sammeln, dann, dass die Convert.ToByte() Überlastung mit dem Byte konvertieren, die fromBase akzeptiert:

diesen Code ersetzen:

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

mit diesem:

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