将bitarray转换为字符串

ZAA*_*ZAA 5 c#

有人可以帮我将bittarray转换成正确的字符串吗?我写了这个:

static String BitArrayToStr(BitArray ba)
        {
            byte[] strArr = new byte[ba.Length / 8];

            System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();

            for (int i = 0; i < ba.Length / 8; i++)
            {
                for (int index = i * 8, m = 1; index < i * 8 + 8; index++, m *= 2)
                {
                    strArr[i] += ba.Get(index) ? (byte)m : (byte)0;
                }
            }

            return encoding.GetString(strArr);
        }
Run Code Online (Sandbox Code Playgroud)

但在输出上我有这个:" *Ȱ& L9 q zȲP *Ȱ& L9 q zȲP *Ȱ&Y(W " - many无法识别的符号,我该怎么办?

ole*_*sii 9

您可以使用此扩展方法:

public static string ToBitString(this BitArray bits)
{
    var sb = new StringBuilder();

    for (int i = 0; i < bits.Count; i++)
    {
        char c = bits[i] ? '1' : '0';
        sb.Append(c);
    }

    return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)


Chr*_*lor 4

您确定您的输入位数组来自编码为 ASCII 的字符串吗?

使用您的代码我做了以下测试

string s = "Hello World";
byte[] bytes = Encoding.ASCII.GetBytes(s);
BitArray b = new BitArray(bytes);
string s2 = BitArrayToStr(b);
Run Code Online (Sandbox Code Playgroud)

s2 的值符合Hello World预期。

更新:

如注释中所述,ASCII 编码器仅将字节 32-127 处理为可打印字符,0-32 是控制字符,将显示符号,而 127 以上的所有内容都将使用 ASCII 回退来处理坏字节。

这里引用MSDN的一段话

http://msdn.microsoft.com/en-us/library/system.text.decoderfallback.aspx

如果编码无法映射输入字节序列,则解码操作可能会失败。例如,ASCIIEncoding 对象无法解码生成代码点值超出 U+0000 到 U+007F 范围的字符的字节序列。

当无法执行编码或解码转换时,.NET Framework 提供了一种称为回退的故障处理机制。您的应用程序可以使用预定义的 .NET Framework 编码器和解码器回退,也可以创建从 EncoderFallback 和 EncoderFallbackBuffer 类派生的自定义编码器回退,或从 DecoderFallback 和 DecoderFallbackBuffer 类派生的自定义解码器回退。