2016-04-27 5 views
-3
string GetBits(string input) 
{ 
    StringBuilder sb = new StringBuilder();    
    foreach (byte b in Encoding.Unicode.GetBytes(input)) 
    { 
     sb.Append(Convert.ToString(b, 2)); 
    } 
    return sb.ToString(); 
} 

Я нашел эту функцию онлайн, чтобы преобразовать строку в двоичную. Как мне сделать обратное?Преобразование двоичной строки обратно в нормальную строку

Например, преобразование слова «привет» в двоичный файл с использованием приведенной выше функции, а затем преобразование полученной двоичной строки обратно в исходное слово/строку?

Я пытаюсь сделать это в C#, и мой вход, который я хочу, чтобы преобразовать обратно строка, заданная функцией выше

+0

Это в значительной степени ваш ответ [C# Byte массив строки Unicode] (http://stackoverflow.com/a/5056351/1734730) –

+0

Я уже пробовал это, но как-то это только выдает тарабарщину. Может быть, из-за поставщика формата при преобразовании байта в строку? –

+1

Вам лучше использовать полужирный текст '** text **' вместо перехода на верхний регистр. Делает это выглядящим плохо. – C4u

ответ

1

Основная проблема заключается в том, что ваша функция ввода неправильно.
Если передать строку «Hello» возвращаемая строка

"10010001100101110110011011001101111" (35 characters ???) 

, но это не правильное представление в двоичном виде слова Hello где каждый символ должен быть представлен ряд 8 0 | 1 (всего 40 символов)

Основная причина этой ошибки заключается в Convert.ToString, которая удаляет ведущие нули из байта, переданного в преобразование.
Таким образом, письмо H должно быть 01001000 (8 символов), но конверсия возвращает 1001000 (7 символов), поэтому все, что следует, неверно и невозможно правильно преобразовать обратно.

Вы можете зафиксировать функцию ввода с

string GetBits(string input) 
{ 
    StringBuilder sb = new StringBuilder(); 

    foreach (byte b in Encoding.UTF8.GetBytes(input)) 
    { 
     string temp = Convert.ToString(b, 2); 

     // This ensure that 8 chars represent the 8bits 
     temp = "00000000".Substring(temp.Length) + temp; 
     sb.Append(temp); 
    } 
    return sb.ToString(); 
} 

Хотя преобразование обратно в «Hello» можно было бы записать в виде

string GetString(string input) 
{ 
    // Probably a checking on the input length as multiple of 8 
    // should be added here.... 

    StringBuilder sb = new StringBuilder(); 
    while (input.Length > 0) 
    { 
     string block = input.Substring(0, 8); 
     input = input.Substring(8); 
     int value = 0; 
     foreach (int x in block) 
     { 
      int temp = x - 48; 
      value = (value << 1) | temp; 
     } 
     sb.Append(Convert.ToChar(value)); 
    } 
    return sb.ToString(); 
} 
+0

большое вам спасибо! изменение при использовании юникода? Просто 'Encoding.Unicode.GetBytes (input)' –

+0

Ум не только это. Также преобразование обратно в строку требует изменений для обработки блоков по 16 байт. Но это должно быть проверено, и я сожалею, но у меня есть нет времени сейчас – Steve

Смежные вопросы