Шифрование

нужно сделать прогу....дана послед байт и 8-битовая маска(в ней 4 единицы и 4 нуля)например маска 01011100дана последовательность байт и она делится по 2 байта10110101|00110101 под ним подписывается маска циклически01011100|01011100 далее формируется новое сообщение в первый байт записываются биты находящиеся на тех местах где в маске единицы, таким образом получится первый байт 01010101, а второй из позиций на которых нули 11010101.и произвести потом обратную операцию.у меня проблема...у меня сообщение это текст....как мне его перевести в биты и наоборот биты в текст?
8 ответов

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


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 систему счисления?


Convert.ToString( value, base )
Не надо так с битами работать!!! Ты что???!!! Это только для случаев вывода чисел для пользователя, но не для работы с битами.Используй BitArray, как тебе уже сказал Bogdan1024.Чуть позже напишу как...


у меня проблема...у меня сообщение это текст....как мне его перевести в биты и наоборот биты в текст?
не в биты только, а в байты:
    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);
А обратную операцию, тебе придется сделать самому   


Спасибо! А можешь если не сложно комментарии написать? а то не совсем понятно...


            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) и если длина исходных данных четная. Оба эти условия не сложно соблюсти дополнительной проверкой и корректировкой данных.


Спасибо! 


            byte[] buffer = null;            BitArray bits = new BitArray(buffer);            for (int i = 0; i < bits.Count; i++)            {                 // bits[i] = true;                 // if( bits[i] ) ............            }
а как теперь из BitArray получить byte?