将二进制字符串表示形式转换为字节数组

时间:2010-08-08 22:51:31

标签: c# binary

如何将字符串(如“01110100011001010111001101110100”)转换为字节数组,然后使用File.WriteAllBytes,使得精确的二进制字符串是文件的二进制。在这种情况下,它将是文本“test”。

5 个答案:

答案 0 :(得分:34)

如果你没有这个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很棒,但必须有一些限制。

答案 1 :(得分:10)

您可以先将字符串拆分为8个字符的字符串序列,然后将这些字符串转换为字节,最后将字节写入文件

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

编辑:这是将字符串拆分为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));

答案 2 :(得分:4)

有点晚了,但这是我的2美分:

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

答案 3 :(得分:2)

实际上@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州,但在这种形式下,它更容易理解。

答案 4 :(得分:1)

其他答案包括你,但为了好玩我写了相反的。从字符串到ascii二进制表示:

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