Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шифрование 
:(
    Опции темы
yarus88
Дата 13.3.2009, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 17.4.2008

Репутация: нет
Всего: нет



нужно сделать прогу....дана послед байт и 8-битовая маска(в ней 4 единицы и 4 нуля)
например маска 01011100
дана последовательность байт и она делится по 2 байта
10110101|00110101 под ним подписывается маска циклически
01011100|01011100 далее формируется новое сообщение в первый байт записываются биты находящиеся на тех местах где в маске единицы, таким образом получится первый байт 01010101, а второй из позиций на которых нули 11010101.
и произвести потом обратную операцию.
у меня проблема...у меня сообщение это текст....как мне его перевести в биты и наоборот биты в текст?
PM MAIL   Вверх
Bogdan1024
Дата 13.3.2009, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

Репутация: 5
Всего: 13



Кажется для этой задачи нужно использовать BitArray или BitVector - уже забыл что именно smile


--------------------
user posted image
PM MAIL   Вверх
yarus88
Дата 14.3.2009, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 17.4.2008

Репутация: нет
Всего: нет



Convert.ToString( value, base )
value - это число, base - это основание.
работает для 2, 8, 10, и 16 
Код

char a = 'a';
            string b = "";
            b = Convert.ToString(a, 2);
            while (b.Length < 8)
                b = "0" + b;

выводит 01100001.
но при обратной операции мне он ошибку постоянно выводит...как теперь перевести в 10 систему счисления?
PM MAIL   Вверх
-Mikle-
Дата 14.3.2009, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 17
Всего: 59



Цитата(yarus88 @  14.3.2009,  17:49 Найти цитируемый пост)
Convert.ToString( value, base )

Не надо так с битами работать!!! Ты что???!!! Это только для случаев вывода чисел для пользователя, но не для работы с битами.

Используй BitArray, как тебе уже сказал Bogdan1024.
Чуть позже напишу как...


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
-Mikle-
Дата 14.3.2009, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 17
Всего: 59



Цитата(yarus88 @  13.3.2009,  19:33 Найти цитируемый пост)
у меня проблема...у меня сообщение это текст....как мне его перевести в биты и наоборот биты в текст?


не в биты только, а в байты:
Код

    byte[] buffer = Encoding.Default.GetBytes("sSDHDcsichsldcnsdvols");


Далее тебе нужен механизм битового доступа к байтам. Либо используй BitArray для простоты, либо работай с битами напрямую.
1)
Код

            byte[] buffer = null;
            BitArray bits = new BitArray(buffer);
            for (int i = 0; i < bits.Count; i++)
            {
                 // bits[i] = true;
                 // if( bits[i] ) ............
            }


2)
Код

            byte[] inpBuff = new byte[] { 0xB5, 0x35 }; // Encoding.Default.GetBytes("jioehjofiewh9fhe");
            byte[] outBuff = new byte[inpBuff.Length];

            byte mask = 0x5C; //01011100
            short dblMask = (short)(((short)mask) << 8 | mask);
            short pattern, pair;

            for (int i = 0, cnt = inpBuff.Length; i < cnt; i += 2)
            {
                pattern = dblMask;
                pair = BitConverter.ToInt16(inpBuff, i);
                for (int bi = 0; bi < 16; bi++)
                {
                    if ((pattern & 0x0001) == 1)
                        outBuff[i] = (byte)((outBuff[i] << 1) | (pair & 0x0001));
                    else
                        outBuff[i + 1] = (byte)((outBuff[i + 1] << 1) | (pair & 0x0001));

                    pair >>= 1;
                    pattern >>= 1;
                }
            }


Необходимо учесть, что при твоем таком алгоритме нужно, чтобы длина запаковываемых данных была четной. Это можно обойти добавляя один незначимый байт в конец, если длина нечетная.

Тело цикла можно сократить вообще до двух строк:
Код

                for (int bi = 0; bi < 16; bi++)
                {
                    int k = 1 - (pattern & 0x0001);
                    outBuff[i + k] = (byte)((outBuff[i + k] << 1) | (pair & 0x0001));

                    pair >>= 1;
                    pattern >>= 1;
                }


Лично мне нравится второй вариант. Тем более он немного быстрее, так как BitArray при каждом обращении по индексу делает много операций:
Код

        return ((this.m_array[index / 0x20] & (((int) 1) << (index % 0x20))) != 0);


А обратную операцию, тебе придется сделать самому  smile 



--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
yarus88
Дата 14.3.2009, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 17.4.2008

Репутация: нет
Всего: нет



Спасибо! А можешь если не сложно комментарии написать? а то не совсем понятно...
PM MAIL   Вверх
-Mikle-
Дата 14.3.2009, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 17
Всего: 59



Код

            byte[] inpBuff = new byte[] { 0xB5, 0x35 }; // Encoding.Default.GetBytes("jioehjofiewh9fhe");
            byte[] outBuff = new byte[inpBuff.Length];

            byte mask = 0x5C; //01011100
            short dblMask = (short)(((short)mask) << 8 | mask);
            short pattern, pair;

            for (int i = 0, cnt = inpBuff.Length; i < cnt; i += 2)
            {
                pattern = dblMask;
                pair = BitConverter.ToInt16(inpBuff, i);
                for (int bi = 0; bi < 16; bi++)
                {
                    int k = 1 - (pattern & 0x0001);
                    outBuff[i + k] = (byte)((outBuff[i + k] << 1) | (pair & 0x0001));

                    pair >>= 1;
                    pattern >>= 1;
                }
            }


Даже не знаю, что тут коментировать то...

inpBuff - это исходный буфер, из которого читаем
outBuff - это буфер, в который пишем результат
mask - твоя маска
dblMask - это та же маска только удвоенная (short - два байта длиной). Значение байта приводим к short и сдвигаем влево на 8 бит, затем операцией OR сливаем с тем же значением маски. Таким образом в старшем и младшем байте будет записано одно значение.

Далее цикл от нуля до длины массива inpBuff. Шаг цикла равен два, так как мы работаем сразу с парой байтов. 
Переменная pair, тоже типа short, и записываем в нее мы два байта из масива. Переменная patern является временной и ее значение равно dblMask. Так как при работе вложенного цикла ее значение будет меняться, то перед началом вложенного цикла мы восстанавливаем ее значение.

Далее цикл от 0 до 16, что соответствует 16 битам, которые мы обрабатываем за один раз.
Тело цикла проводит операцию только над младшими битами pattern и pair.
(pattern & 0x0001) - это битовая операция AND над pattern (думаю эти вещи пояснять не надо). В результате жтой операции, значение будет равно либо ноль либо один, в зависимости от младшего бита. Так как по условию задачи по "1"кам мы пишем в младший байт, то пришлось сделать 1 - (pattern & 0x0001). Таким образом, если значение младшего бита равно "1", то 1 - 1 = 0, а если "0", то 1 - 0 = 1. То есть мы выбрали индекс.

В следующей строчке еще пара битовых операций. Распишу их начиная с глубины.
outBuff[i + k] << 1  -  смещает все биты в outBuff[i + k] влево на один, тем самым подготавливая место для следующего бита.
pair & 0x0001  -  выделяет значение младшего бита (также как с pattern).
OR (|) между ними приводит к их слиянию. Таким образом младший бит outBuff[i + k] становится равным младшему биту pair, а в ней у нас два байта из inpBuff.

И последнее двигаем patern и pair вправо на один бит, двигая тем самым следующий старший бит в младший разряд и все повторяется до тех пор, пока не продвинем все 16 бит.

Далее внешний цикл шагает на два вперед и все повторяется со следующими двумя байтами.

Весь этот алгоритм будет рабртать правильно, только если кол-во нулей и единиц в маске равно (по 4) и если длина исходных данных четная. Оба эти условия не сложно соблюсти дополнительной проверкой и корректировкой данных.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
yarus88
Дата 17.3.2009, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 17.4.2008

Репутация: нет
Всего: нет



Спасибо! 
PM MAIL   Вверх
yarus88
Дата 26.3.2009, 00:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 17.4.2008

Репутация: нет
Всего: нет



Код

            byte[] buffer = null;
            BitArray bits = new BitArray(buffer);
            for (int i = 0; i < bits.Count; i++)
            {
                 // bits[i] = true;
                 // if( bits[i] ) ............
            }

а как теперь из BitArray получить byte?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0584 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.