2015-02-27 7 views
0

У меня есть строка бит, как это 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

Как я уже сказал, «Это буквы« sh ».« Итак, я ожидал буквы «sh». И я получаю вопросительные знаки, иероглифы и т. Д. – Errorfreak

+0

Какая кодировка вы используете? UTF8 из «sh» дает мне «1100111000010110», код здесь, http://ideone.com/UdvG6r – Jodrell

ответ

5

Есть пара проблем с вашим кодом.

  1. Первый BitArray будет обратный порядок битов - это проще в использовании Convert.ToByte

  2. Ваш строка ввода содержит два байта (один на символ), но вы используете Encoding.Unicode расшифровать его, что является кодирование UTF16 (два байта на символ), вам нужно использовать Encoding.UTF8

Рабочий код

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

Спасибо, отлично работает – Errorfreak

1

A) Ваша строка ASCII, не UNICODE: 8 бит на символ

B) Самый старший бит каждого байта находится на левой стороне, так что странно математика используется в млрд [...]

с) Закомментированная частью бесполезно, потому что «ложь» состояние по умолчанию из 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