Wie konvertiert man eine Zeichenfolge wie "01110100011001010111001101110100" in ein Bytearray und dann verwendet File.WriteAllBytes, so dass die genaue binäre Zeichenfolge die Binärdatei der Datei ist. In diesem Fall wäre es der Text "Test".Konvertieren einer binären Zeichenfolgendarstellung in ein Bytearray
Antwort
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.
Viel verständlicher – jwsample
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;) –
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
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:
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
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;
}
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
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);
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.
- 1. Konvertieren einer binären Zeichenfolge in ein Zweierkomplement
- 2. "Buchstäblich" einen String in ein Bytearray konvertieren
- 3. Konvertieren einer Zeichenfolgendarstellung einer Konstante in eine Konstante?
- 4. PIL: Bytearray in Bild konvertieren
- 5. Konvertieren von Schlüsselsequenzvektor in benutzerlesbare Zeichenfolgendarstellung?
- 6. Converting ein Float in Bytearray
- 7. Bytearray von Oracle RAW in System.Guid konvertieren?
- 8. Konvertieren von ByteArray in UUID Java
- 9. Konvertieren von Bitmap in ByteArray Android
- 10. Konvertieren von Python ByteArray -> Php
- 11. Bytearray von einer Webcam
- 12. Konvertieren einer hexadezimalen Zeichenfolge in ein Byte in Java
- 13. Konvertieren von binären auf hexadezimal
- 14. Konvertieren von DFS in binären Baum
- 15. Wird beim Konvertieren von Bytearray in Byte eine Kopie erstellt?
- 16. wie ByteArray in AudioBuffer konvertieren und in Javascript
- 17. Perl konvertieren binären Stream zu hex
- 18. Verwenden von Python zum Konvertieren von Bytearray in Float
- 19. C# ByteArray zu Image
- 20. Wie kann ich eine Datei in ein ByteArray in Flex konvertieren?
- 21. Wie erhalte ich ein IL-Bytearray von einer DynamicMethod?
- 22. Umwandeln der Zeichenfolgendarstellung eines Wörterbuchs in ein reales Wörterbuch
- 23. Wie erhalten Sie Zeichenfolgendarstellung einer Bitfeldaufzählung in C# (MessageQueueErrorCode)?
- 24. Konvertieren einer binären Sequenz aus einer Datei in einem festen Punkt gelesen Nummer
- 25. Sortiertes Array in binären Suchbaum mit minimaler Höhe konvertieren
- 26. Lesen von der Ausgabe eines Prozesses in ein ByteArray
- 27. Implementieren einer binären Semaphor-Klasse in C++
- 28. Javascript einen binären Wert einer Zahl
- 29. Anzahl der 1s in einer binären Zahl
- 30. Hex byteArray
Hier ist ein guter Anfang: http://msdn.microsoft.com/en-us/library/system.convert_methods.aspx – NullUserException