Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2015, 12:27   #1
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию Как проще конвертировать строку с текстом в бинарную строку, а затем наоборот

Я уже находил ответ на этот вопрос здесь http://programmersforum.ru/showthread.php?t=283376
Но теперь ситуация интереснее. Сейчас я рассматривал код, представленный Stilet, еще раз, и смотрите:
Код:
 string chr2(char c)
        {
            string s = ""; //Поставить " ", чтобы разделять каждые 8 бит 
            for (int i = 0; i < 16; c = (char)((byte)c >> 1))
            {
                ///////////////////Процесс формирования строки с бинарными данными/////////////////
                s = ((((byte)c & 1) != 0) ? "1" : "0") + "" + s;

                //////////////Процесс нахождения точек для графика с бинарными данными/////////////
                int s1 = ((((byte)c & 1) != 0) ? 1 : 0);
                list.Add(icount + chnum, s1);

                //////////Находим разницу между всеми битами для фазоразностной модуляции//////////
                sdif += (((s1 & s1_prev) != 0) ? "1" : "0");
                s1_prev = s1;       //Буфер прошлого значения s1

                icount--;
                i++;
            }
            chnum = chnum + 16;
            return s;
        }
        string asbin(string s)
        {
            string res = "";

            foreach (char c in s)
            {
                res += chr2(c);
                icount = 16;
            }

            return res;
        }
Когда на месте "16" везде были "8", то все проходило шикарно. Но моя программа доросла до приемо-передатчика, и что-то не работало в ней. Я сопоставил все сигналы приемника и передатчика (это не в понимании программиста приемо-передатчик, так что просто примите, как есть).
Посмотрел - бинарные данные, выданные кодом Stillet, совпадают с бинарными данными, полученными после последнего мною сделанного алгоритма до преобразования обратно в текст. Еще раз обращу внимание: в одной программе "передача", в другой - "прием", в передатчике есть сигналы, аналогичные сигналам в приемнике, которые можно сравнить между собой.

Так вот, я понял, что проблема именно в том, что "нули" и "единицы" у меня получились верно, только переданный текст я по ним восстановить не могу. И тут я понял. У меня первый символ "Э" в ASCII таблице занимает 16 бит. Я же получил лишь 8 бит после работы вышеуказанного кода (где 8 вместо 16). 101101 или 45. Это соответствует другому символу в ASCII таблице, то есть получается, что нужно брать по 16 бит. А если брать по 16 бит, то вышеуказанный код, почему-то, обнуляет высшие 8 разрядов, получается просто "0000000000101101".

Это так, чтобы видно было, что я старался Вы можете забыть все вышесказанное, и просто расскажите снова, как проще и быстрее всего конвертировать текстовую строку в строку нулей и единиц? А потом сделать из нее заново текстовую строку.
Krasi вне форума Ответить с цитированием
Старый 06.11.2015, 13:24   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я в вашей прошлой теме же Вам давал ссылочку на тему, где строка конвертируется в массив байт и обратно.
Вы не ходили по ссылке?!

конвертировать строку из UTF-8 в строку из ноликов и единичек можно так:
Код:
			String ss = "Эра";
 			UTF8Encoding utf8 = new UTF8Encoding();
			Byte[] bytes = utf8.GetBytes( ss );			
			foreach (var b in bytes) {
				Console.WriteLine( Convert.ToString(b, 2).PadLeft(8, '0') );
			}
или, если нужно в результате получить одну длинную строку, тогда можно так:
Код:
			String ss = "Эра";
 			UTF8Encoding utf8 = new UTF8Encoding();
			Byte[] bytes = utf8.GetBytes( ss );		
	
                        var sb = new System.Text.StringBuilder();
			foreach (var b in bytes) {
            	            sb.Append(Convert.ToString(b, 2).PadLeft(8, '0'));
                        }
                        Console.WriteLine("Бинарная строка = {0}", sb);

а если не секрет, зачем Вам конвертировать именно в бинарное представление?
Вы же в 16 раз увеличиваете объём передаваемой информации!!

Последний раз редактировалось Serge_Bliznykov; 06.11.2015 в 13:38.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.11.2015, 13:44   #3
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Цитата:
зачем Вам конвертировать именно в бинарное представление?
Там долгая история, я уже сам понял, что можно проще, хотя как именно - можете подсказать Но пока я хочу уже доделать версию программы, где все будет именно так, чтобы уже успокоиться, что это работает. Поэтому самый важный вопрос - как сделать теперь обратную операцию, строку 0 и 1 конвертировать в буквы?

У меня на выходе передатчика вч-тракт, усилитель, антенна, по идее. Хотя бы выход видеокарты - то есть динамик. И мне привычнее делать обработку именно ноликов и единиц. Например, для относительной фазовой манипуляции мне нужно сравнивать каждые 2 соседних бита между собой. Ну вот как это проще на C сделать? Я уже думал про массивы бит (True/False Array)... И просто так исторически сложилось, что я начал работать со строкой, хотя я понял, что это медленно.

Насчет GetString я понял, а дальше - не знаю.

Последний раз редактировалось Krasi; 06.11.2015 в 14:05.
Krasi вне форума Ответить с цитированием
Старый 06.11.2015, 14:09   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
важный вопрос - как сделать теперь обратную операцию, строку 0 и 1 конвертировать в буквы?
Вы издеваетесь?
Вы плодите темы, а потом задаёте вопрос, на который в другой теме уже получили ответ?!

ладно, если Вам тяжело посмотреть в своей прошлой теме, мне это сделать не тяжело.
копирую код из вашей прошлой темы:

sInput строка, состоящая из ноликов и единичек.
Код:
			int numOfBytes = sInput.Length / 8;
			byte[] encodedBytes = new byte[numOfBytes];
			for(int i = 0; i < numOfBytes; ++i)
			{
    				encodedBytes[i] = Convert.ToByte(sInput.Substring(8 * i, 8), 2);
			}
			String sResult = Encoding.GetEncoding(65001).GetString(encodedBytes);
			
			Console.WriteLine("Полученная строка: {0}", sResult);

ещё вопросы?..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.11.2015, 14:20   #5
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Спасибо! Все получилось
Krasi вне форума Ответить с цитированием
Старый 06.11.2015, 15:10   #6
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Нет, понял. Не все получилось!!! Мне нужно, чтобы каждый символ преобразовывался в определенное число бит. Если уж 16 - то чтобы каждый символ занимал 16 бит. У меня было число бит 1800 при 8 бит на символ, стало 2432. А мне уж тогда все 3600 бит надо! Как можно четко детерминировать здесь число бит на каждый символ?
Krasi вне форума Ответить с цитированием
Старый 06.11.2015, 15:15   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Krasi Посмотреть сообщение
Нет, понял. Не все получилось!!! Мне нужно, чтобы каждый символ преобразовывался в определенное число бит. Если уж 16 - то чтобы каждый символ занимал 16 бит. У меня было число бит 1800 при 8 бит на символ, стало 2432. А мне уж тогда все 3600 бит надо! Как можно четко детерминировать здесь число бит на каждый символ?
ничего не понял.
каждый символ занимает столько бит, сколько ему отведено в заданной вами кодировке. в одной это может быть 7 бит, в другой - восемь, в третьей 16, 32 бита и т.д.
для Вас открытие, что в unicode разные символы занимают РАЗНОЕ число байт?!!
И язык программирования (при правильном указании кодировки) позволяет Вам этого не знать, он все внутренние преобразования берёт на себя, избавляя от этого программиста.
Вас это чем-то не устраивает?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.11.2015, 15:28   #8
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Просто я встретился с ошибкой, что у меня эти бинарные биты дальше обрабатываться моим кодом не хотели. Код я пишу уже месяц, поэтому мне проще разобраться сначала, что случилось. Изначально я генерировал кратное 1800 количество символов (затем по очереди обрабатывал каждые 1800) 0 и 1 в строке "бинарных данных". Сейчас смотрю - эта длина сейчас 3304 при моем исходном тексте.
Я посмотрел, 1 символ "Э" занимает 16 бит, вроде, вот я и решил, что это 16-битная конвертация.
Мне нужно, чтобы итоговое число обязательно делилось на 3 - это, по ходу дела, единственное препятствие. Тогда считаем 3304/3 = 1101,333... - вот в этом проблема, я думаю. Как можно исправить?

Короче, пишу от начала до конца, как есть. Есть очень длинная строка A. Я ее разделяю на несколько строк B, сразу нельзя сказать, на сколько, но длина каждой равна 225. 225*8 = 1800. Вот такое число символов я хочу обрабатывать за раз. Это обязательно пока что, потому что я туго соображаю, как исправить мой код не под 1800 символов. Я там и на графики вывожу по 1800, и у меня длина символа в моей задачи фиксирована (1800 - 4 символа, 450 - 1 символ, после преобразования - 150 единиц в одном моем связном символе, не больше, не меньше), и нельзя ее менять. Массив Bdig - это 0 и единицы в виде строчки, которые генерируются кодом, который Вы помогли освоить. Таким образом, 225*8 - это длина Bdig, и я хочу ее именно 1800. Если 225*16, то получится 3600. Тогда я могу передавать за раз уже не 225 символов, а 112.5. Ок, я уже не заморачиваюсь, можно вот так сделать?

Последний раз редактировалось Krasi; 06.11.2015 в 15:44.
Krasi вне форума Ответить с цитированием
Старый 06.11.2015, 15:40   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Мне нужно, чтобы итоговое число обязательно делилось на 3
не понятно, зачем, но реализуемо.
добавляете в конец текста однобайтовые символы, пока число бит не станет кратным трём.
Это, например, символ " "(пробел) или "." или "@" или любой другой из первой половины ASCII таблицы.
Вот, например, к вашей строке длиной 3304 бит нужно добавить один 8-мибитный символ, чтобы число бит стало кратным трём.


p.s. ещё раз повторю. Вы идёте не в ту сторону. Заблудитесь!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.11.2015, 15:48   #10
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

Да я бы хотел пока сделать с 16-битными числами. Чтобы у меня длина получалась не 3304, а 3600. Чтобы даже пустой символ в строчке обозначался 8-ми битами. Так проще пока. А то добавлять еще что-то - это костыль будет в моем случае, мне надо всего-то навсего передать строку неизвестной длины. А разбиваю я ее на строки длиной 255 символов только потому, что изначально рассчитал, чтобы у меня было 4 моих символа, в каждом из которых обязательно по ТЗ должно быть 450 бит информации. Разве сложно так намудрить пока?

Последний раз редактировалось Krasi; 06.11.2015 в 16:00.
Krasi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не получается перевернуть наоборот строку символьного массива. Zaza7 Общие вопросы C/C++ 8 30.10.2012 13:40
Двунаправленный линейный список строк. Вставить строку, удалить строку и заменить строку tarasman11 Паскаль, Turbo Pascal, PascalABC.NET 4 05.07.2012 20:27
Конвертировать строку из ANSI в UNICODE Миша Общие вопросы Delphi 8 28.12.2009 18:23
Как при нажатии на строку в Listbox передавать нажатую строку в переменную Михаил Юрьевич Общие вопросы Delphi 5 16.03.2009 12:59