![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| yarus88 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 17.4.2008 Репутация: нет Всего: нет |
нужно сделать прогу....дана послед байт и 8-битовая маска(в ней 4 единицы и 4 нуля)
например маска 01011100 дана последовательность байт и она делится по 2 байта 10110101|00110101 под ним подписывается маска циклически 01011100|01011100 далее формируется новое сообщение в первый байт записываются биты находящиеся на тех местах где в маске единицы, таким образом получится первый байт 01010101, а второй из позиций на которых нули 11010101. и произвести потом обратную операцию. у меня проблема...у меня сообщение это текст....как мне его перевести в биты и наоборот биты в текст? |
|||
|
||||
| Bogdan1024 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1436 Регистрация: 28.9.2005 Где: Киев Репутация: 5 Всего: 13 |
Кажется для этой задачи нужно использовать BitArray или BitVector - уже забыл что именно
-------------------- ![]() |
|||
|
||||
| yarus88 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 17.4.2008 Репутация: нет Всего: нет |
Convert.ToString( value, base )
value - это число, base - это основание. работает для 2, 8, 10, и 16
выводит 01100001. но при обратной операции мне он ошибку постоянно выводит...как теперь перевести в 10 систему счисления? |
|||
|
||||
| -Mikle- |
|
|||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 17 Всего: 59 |
Не надо так с битами работать!!! Ты что???!!! Это только для случаев вывода чисел для пользователя, но не для работы с битами. Используй BitArray, как тебе уже сказал Bogdan1024. Чуть позже напишу как... -------------------- Если тебе плюют в спину, значит ты впереди... |
|||
|
||||
| -Mikle- |
|
||||||||||||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 17 Всего: 59 |
не в биты только, а в байты:
Далее тебе нужен механизм битового доступа к байтам. Либо используй BitArray для простоты, либо работай с битами напрямую. 1)
2)
Необходимо учесть, что при твоем таком алгоритме нужно, чтобы длина запаковываемых данных была четной. Это можно обойти добавляя один незначимый байт в конец, если длина нечетная. Тело цикла можно сократить вообще до двух строк:
Лично мне нравится второй вариант. Тем более он немного быстрее, так как BitArray при каждом обращении по индексу делает много операций:
А обратную операцию, тебе придется сделать самому -------------------- Если тебе плюют в спину, значит ты впереди... |
||||||||||||
|
|||||||||||||
| yarus88 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 17.4.2008 Репутация: нет Всего: нет |
Спасибо! А можешь если не сложно комментарии написать? а то не совсем понятно...
|
|||
|
||||
| -Mikle- |
|
|||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 17 Всего: 59 |
Даже не знаю, что тут коментировать то... 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) и если длина исходных данных четная. Оба эти условия не сложно соблюсти дополнительной проверкой и корректировкой данных. -------------------- Если тебе плюют в спину, значит ты впереди... |
|||
|
||||
| yarus88 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 17.4.2008 Репутация: нет Всего: нет |
Спасибо!
|
|||
|
||||
| yarus88 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 17.4.2008 Репутация: нет Всего: нет |
а как теперь из BitArray получить byte? |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |