将二进制格式字符串(0和1)转换为byte []的更好方法是什么?

时间:2013-10-31 14:07:55

标签: c# binary asciiencoding

我写了这个,是个好人吗?

byte[] ConvertToBytes(string b)
    {
        BitArray bits = new BitArray(b.ToList().ConvertAll<bool>(x => x == '1').ToArray());

        byte[] ret = new byte[bits.Length];
        bits.CopyTo(ret, 0);

        return ret;
    }

(数组必须可以作为ascii字符串读取)

6 个答案:

答案 0 :(得分:1)

string array = "1010101";
byte[] sequence = array.Select(c => Convert.ToByte(c.ToString())).ToArray();

byte[] bytes = Encoding.ASCII.GetBytes(array);

答案 1 :(得分:1)

我可以建议一种有效的方法,认为它一定不能很难实现。

我假设字符串很好地形成了它是字符串格式的二进制表示。

private static byte[] BinStringToBytes(string binary)
{
    //make sure the string length is multiple of 32, if not pad it with zeroes
    var neededZeros = 32 - (binary.Length % 32);

    if (neededZeros > 0)
        binary = string.Concat(new string('0', neededZeros), binary);

    var blocks = binary.Length / 32;

    var binbytes = new byte[blocks * 4];

    for (var i = 0; i < blocks; i++)
    {
        var numstr = binary.Substring(i * 32, 32);
        var num = Convert.ToUInt32(numstr, 2);
        var bytes = BitConverter.GetBytes(num);
        Array.Copy(bytes, 0, binbytes, i * 4, 4);
    }

    return binbytes;
}

答案 2 :(得分:0)

Mehrdad对你的问题a good answer。代码:

static byte[] GetBytes(string str)
{
    byte[] bytes = new byte[str.Length * sizeof(char)];
    System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
    return bytes;
}

答案 3 :(得分:0)

我可能会误解这个问题,但是:

public byte[] BitStringToAsciiArray(string bits)
{
    return Encoding.ASCII.GetBytes(bits);
}

但是,如果输入字符串中的任何字符不是'0''1',则不会出现任何错误。

但是否则它确实返回一个字节数组,对于输入字符串中的'0'为48,对于输入字符串中的'1'为49。这些是'0''1'的ASCII代码。

答案 4 :(得分:0)

替代:

最好不要使用byte[],但实际上只是将二进制数存储为整数:

Convert.ToInt32("1011", 2) // returns 11

反之亦然:

Convert.ToString(11, 2) // returns "1011"

如果你需要得到nth位(来自右边):

public int GetNthBit(int binary, int n)
{
    return (binary >> n) % 2;
}

用法:

GetNthBit(11, 2) // returns 0

答案 5 :(得分:0)

将所有字符追加为以下长度:

var l = 0L;
foreach (var c in s)
{
    l <<= 1;
    l += c;
}
var b = BitConverter.GetBytes(l);