2010-08-08 24 views

Antwort

29

Falls Sie diesen LINQ Fetisch nicht haben, so häufig in letzter Zeit, können Sie die normale Art und Weise versuchen

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 ist groß, aber es Es muss Grenzen geben.

+0

Viel verständlicher – jwsample

+1

Das setzt voraus, dass die String-Länge ein Vielfaches von 8 ist ... Aber Sie haben Recht, es ist wahrscheinlich einfacher, so zu verstehen. Ich denke, ich bin total süchtig nach LINQ;) –

+2

Hmm. Ich würde argumentieren, dass der LINQ verständlicher ist. Es beschreibt prägnant, was getan wird, ohne die (lauten) Schritte zu beschreiben, um dieses Ziel zu erreichen. Es hat einen viel höheren Rauschabstand. – spender

9

Sie durch Aufteilen der Zeichenfolge in eine Folge von 8-Zeichenketten beginnen könnte, dann diese Strings in Bytes, konvertieren und schreiben schließlich die Bytes in einer Datei

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: hier ist eine andere Art und Weise die Zeichenfolge in 8-Zeichen Stücke aufzuspalten, vielleicht ein bisschen einfacher:

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

Wenn Sie wissen, dass die Länge der Zeichenfolge ein Vielfaches von 8 ist, können Sie es sogar noch einfacher machen:

+0

Gerade stieß auf diese Frage. Ein nettes Spielzeugproblem ... gut für ein Interview. Ich dachte, ich würde es versuchen, bevor ich die Antworten lese. Passt Ihren zweiten Ansatz virtuell Begriff für Begriff. Ich bin auch süchtig nach LINQ! +1 – spender

0

Die anderen Antworten haben Sie abgedeckt, aber nur zum Spaß habe ich das Gegenteil geschrieben. Wenn man von der Zeichenfolge an der ascii Binärdarstellung:

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; 
    } 
+2

Sie möchten von einem Byte-Array auf die binäre Repräsentation gehen. Ein Zeichen ist ein 16-Bit-Datentyp, also würden Sie die obersten acht Bits jedes Zeichencodes abschneiden. Verwenden Sie auch nicht + = um eine Zeichenkette zu erstellen, sie skaliert furchtbar schlecht, verwenden Sie stattdessen einen StringBuilder. – Guffa

3

Ein bisschen spät, aber hier ist meine 2 Cent:

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

Tatsächlich ist die Antwort von @Maciej nicht korrekt ist. Wie @ Phate01 bemerkte, ist die numOfBytes nur für die Eingangslänge korrekt, die eine Leistung von 8 ist. Die zweite Sache ist, dass das Byte-Array von n bis 0 indexiert werden sollte, nicht umgekehrt. Hier ist der Code Beispiel:

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

Dies verbessert werden kann, um loszuwerden, den if statetment aber in dieser Form ist es verständlich.

Verwandte Themen