【问题标题】:Better way to convert a binary format string(0 and 1) to byte[]?将二进制格式字符串(0 和 1)转换为字节 [] 的更好方法?
【发布时间】:2013-10-31 14:07:54
【问题描述】:

我写了这个,写的好吗?

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 字符串可读)

【问题讨论】:

标签: c# binary asciiencoding


【解决方案1】:
string array = "1010101";
byte[] sequence = array.Select(c => Convert.ToByte(c.ToString())).ToArray();

或者

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

【讨论】:

  • ☺ 这是我得到的所有字符,我认为不适合 ascii 格式
  • 短格式:array.Select(c => (byte)c).ToArray();
【解决方案2】:

我可以提出一个有效的方法,认为它一定不难实现。

我假设字符串格式正确,它是字符串格式的二进制表示。

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

【讨论】:

  • 有点长,给了我一个变形的字符串,例如二进制中的loool在解码时变成l looo。我正在寻找类似直接解码方法的方法,但没有,所以我继续使用自己的方法,无论如何谢谢。
【解决方案3】:

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

【讨论】:

  • 我得到相同的二进制字符串,只是数字之间有一个空格,就像这样0 1 1 1 0 1 0 0 0 1 1 0 0 1 0 1 0 1 1 1 0 0 1 1 0 1 1 1 0 1 0 0
【解决方案4】:

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

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

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

但除此之外,它确实返回一个字节数组,每个字节数组对于输入字符串中的'0' 为 48,对于输入字符串中的'1' 为 49。这些分别是'0' 和'1' 的ASCII 码。

【讨论】:

  • 该函数必须将二进制格式转换为字节[],而不仅仅是字符串,否则我得到相同的解码字节
  • @Sam 什么二进制格式?输入是一个字符串。你能提供一个示例输入字符串吗?根据您的问题,人们会假设它看起来像:“1010111010110”之类的东西。如果输出数组必须作为 ASCII 字符串可读,则它只能由值为 48 或 49 的字节组成。
【解决方案5】:

替代方案:

最好不要使用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

【讨论】:

    【解决方案6】:

    将所有字符追加到一个 long 中,如下所示:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-12
      • 1970-01-01
      • 2016-01-01
      • 2012-12-30
      • 2017-04-25
      • 1970-01-01
      • 2013-03-24
      相关资源
      最近更新 更多