如何将字符串“01110100011001010111001101110100”转换为字节数组,然后使用File.WriteAllBytes,并使得文件的二进制内容与原始字符串相同。在这种情况下,它将是文本“test”的二进制表示。
如果你不喜欢这种最近流行的 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很棒,但一定有一些限制。
input.Length / 8
没有被正确地四舍五入,且 double 值为 1.75,则 numOfBytes 为 1。请注意! - Phate01string 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);
编辑:这里有另一种将字符串分成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));
实际上,@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);
}
这可以改进以消除if
语句,但在这种形式下更易理解。
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);
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;
}
StringBuilder
,但是如果您的输入是"01110100011001010111001101110100"
,那么抱歉,这是一个字符串,而不是byte[]
,除非您将其分成8个块。 - vapcguy