Unicode的位串

时间:2015-02-27 10:45:59

标签: c# string unicode bits

我有一串比特,像这样string str = "0111001101101000"这是字母“sh”  我需要用它来制作Unicode字母。我正在做以下事情:

BitArray bn = new BitArray(str.Length); //creating new bitarray
for (int kat = 0; kat < str.Length; kat++)
{
    if (str[kat].ToString() == "0")//adding boolean values into array
    {
        bn[kat] = false;
    }
    else
        bn[kat] = true;
}

byte[] bytes = new byte[bn.Length];//converting to bytes
bn.CopyTo(bytes, 0);
string output = Encoding.Unicode.GetString(bytes); //encoding                          

textBox2.Text = output; // result in textbox

但输出文本只是完全混乱。怎么做对了?

2 个答案:

答案 0 :(得分:5)

您的代码存在一些问题。

  1. 首先BitArray将反转位顺序 - 它更容易使用 Convert.ToByte

  2. 您的输入字符串包含两个字节(一个 每个字符),但您正在使用Encoding.Unicode对其进行解码 是UTF16编码(每个字符两个字节),您需要使用Encoding.UTF8

  3. 工作代码

    string str = "0111001101101000";
    
    int numOfBytes = str.Length / 8;
    byte[] bytes = new byte[numOfBytes];
    for (int i = 0; i < numOfBytes; ++i)
    {
        bytes[i] = Convert.ToByte(str.Substring(8 * i, 8), 2);
    }
    
    string output = Encoding.UTF8.GetString(bytes);     
    

答案 1 :(得分:1)

A)你的字符串是ASCII,而不是UNICODE:每个字符8位

B)每个字节的最高位在左边,所以在bn [...]

中使用了奇怪的数学

C)评论的部分没用,因为&#34; false&#34;是BitArray

的默认状态

D)字节数组的长度错误。 8位== 1个字节! : - )

string str = "0111001101101000";

BitArray bn = new BitArray(str.Length); //creating new bitarray

for (int kat = 0; kat < str.Length; kat++) {
    if (str[kat] == '0')//adding boolean values into array
    {
        //bn[(kat / 8 * 8) + 7 - (kat % 8)] = false;
    } else {
        bn[(kat / 8 * 8) + 7 - (kat % 8)] = true;
    }
}

// 8 bits in a byte
byte[] bytes = new byte[bn.Length / 8];//converting to bytes
bn.CopyTo(bytes, 0);

string output = Encoding.ASCII.GetString(bytes); //encoding    

可能更好:

string str = "0111001101101000";

byte[] bytes = new byte[str.Length / 8];

for (int ix = 0, weight = 128, ix2 = 0; ix < str.Length; ix++) {
    if (str[ix] == '1') {
        bytes[ix2] += (byte)weight;
    }

    weight /= 2;

    // Every 8 bits we "reset" the weight 
    // and increment the ix2
    if (weight == 0) {
        ix2++;
        weight = 128;
    }
}

string output = Encoding.ASCII.GetString(bytes); //encoding