Основная проблема заключается в том, что ваша функция ввода неправильно.
Если передать строку «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();
}
Это в значительной степени ваш ответ [C# Byte массив строки Unicode] (http://stackoverflow.com/a/5056351/1734730) –
Я уже пробовал это, но как-то это только выдает тарабарщину. Может быть, из-за поставщика формата при преобразовании байта в строку? –
Вам лучше использовать полужирный текст '** text **' вместо перехода на верхний регистр. Делает это выглядящим плохо. – C4u