Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.99/68: Рейтинг темы: голосов - 68, средняя оценка - 4.99
34 / 21 / 2
Регистрация: 31.03.2009
Сообщений: 362

Изменение битов

19.01.2010, 17:49. Показов 13629. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я бы хотел узнать, можно ли в C# как нибудь поменять биты в байте например? я хочу попробовать написать крипт систему на основе замены некоторых битов, например с 0 на 1 и наоборот, но не всех, а только например 1-го и 5-го
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.01.2010, 17:49
Ответы с готовыми решениями:

Чтение битов
Как читать 16 битные знаковые числа с com порта начиная с заголовка? Т.е. пришло число 0x20 0x4e ........... Нужно начать чтение с...

Сколько битов в байте?
Всем привет! подскажите пожалуйста код программы, которая показывает сколько битов в байте! заранее спасибо

Получение битов из String
Дана строка string str = "Привет,пока"; Нужно получить в юникоде новую строку с битами. Пробовал System.Text.Encoding.Unicode, не...

21
мну довольно <(-__-)l
 Аватар для gGrn-7DA
217 / 206 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
19.01.2010, 19:40
Как вариант могу посоветовать почитать Шилдта. Там у него в начале книги описываются интересующие вас операторы. Они уже придуманы разработчиками Майкрософт и включены в экспресс версии VS.

упс...
0
Заблокирован
20.01.2010, 16:46
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
static void Main(string[] args)
        {
            Random r = new Random();
            int k = r.Next(77,255);
 
            //исходный байт
            byte b =Convert.ToByte(k);
 
            int bi = Convert.ToInt32(b);
            string hex = Convert.ToString(b, 2);
            Console.WriteLine("Исходный  байт");
            Console.WriteLine(Convert.ToString(b, 2));
            char[] CH = new char[8];
            int i = CH.Length-1;
            int index = CH.Length - hex.Length;
            hex.CopyTo(0, CH, index, hex.Length);
            //заменяем нули на единици и наоборот в 1 и 5 битах
            if (CH[6] == '1')
                bi = bi - 2;//отнимаем вес первого бита
            else
                bi = bi + 2;//прибавляем вес первого бита 
            if (CH[2] == '1')
                bi = bi - 32;//отнимаем вес пятого бита
            else
                bi = bi + 32;//прибавляем вес пятого бита
 
            //РЕЗУЛЬТАТ
            byte output = Convert.ToByte(bi);
 
            Console.WriteLine("Байт после замены 1 и 5 битов");
            Console.WriteLine(Convert.ToString(output, 2));
            Console.ReadKey();
 
        }
1
мну довольно <(-__-)l
 Аватар для gGrn-7DA
217 / 206 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
20.01.2010, 17:25
Но все равно почитать стоит)
0
Заблокирован
20.01.2010, 17:40
Ты похоже гордишься тем, что прочитал ее
0
34 / 21 / 2
Регистрация: 31.03.2009
Сообщений: 362
20.01.2010, 17:47  [ТС]
ssv_www, а можете подробнее написать коментарии к строкам? и еще, что значит "вес бита"
0
Заблокирован
20.01.2010, 17:55
нулевой бит, когда установлен в единицу равен 1, 1 равен 2, 2->4, 3->8 и так далее. Это и есть вес бита
0
34 / 21 / 2
Регистрация: 31.03.2009
Сообщений: 362
20.01.2010, 18:13  [ТС]
я разобрался что к чему, только вот исправьте 6 на 7, иначе изменять будет 2-й бит, а не 1-й

точнее надо отнимать или складывать не 2, а 1
0
Кибернетик
 Аватар для СyberSpec
465 / 89 / 12
Регистрация: 10.04.2009
Сообщений: 424
20.01.2010, 18:17
8 часовой рабочий день сказывается сори мэн
0
34 / 21 / 2
Регистрация: 31.03.2009
Сообщений: 362
20.01.2010, 18:18  [ТС]
СyberSpec, а я что не подумал? я потому и сказал что заметил ошибку
1
Заблокирован
20.01.2010, 18:18
Первый справа - Это нулевой бит
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//генерируем случайное число
            Random r = new Random();
            int k = r.Next(77,255);
 
            //исходный байт
            byte b =Convert.ToByte(k);
// объявляем переменную, которая будет нам необходима в процессе вычисления
            int bi = Convert.ToInt32(b);
            //строке присваиваем значение нашего исходного байта по основанию два
            string hex = Convert.ToString(b, 2);
            Console.WriteLine("Исходный  байт");
            Console.WriteLine(Convert.ToString(b, 2));
            //объявляем массив из 8 символов (= количество бит в байте)
            char[] CH = new char[8];
            //не нужная переменная - забыл удалить
          //  int i = CH.Length-1;
            //узнаем на сколько длина массива больше длинны строки (при небольших значениях байта старшие биты не записываются)
            int index = CH.Length - hex.Length;
            //копируем строку в массив
            hex.CopyTo(0, CH, index, hex.Length);
            //заменяем нули на единици и наоборот в 1 и 5 битах
            if (CH[6] == '1')
                bi = bi - 2;//отнимаем вес первого бита
            else
                bi = bi + 2;//прибавляем вес первого бита 
            if (CH[2] == '1')
                bi = bi - 32;//отнимаем вес пятого бита
            else
                bi = bi + 32;//прибавляем вес пятого бита
 
            //РЕЗУЛЬТАТ
            //преобразовываем переменную которую мы объявляли вначале в байт
            byte output = Convert.ToByte(bi);
 
            Console.WriteLine("Байт после замены 1 и 5 битов");
            //выводим результат в двоичном исчислении
            Console.WriteLine(Convert.ToString(output, 2));
            Console.ReadKey();
1
34 / 21 / 2
Регистрация: 31.03.2009
Сообщений: 362
20.01.2010, 18:20  [ТС]
спасибо, но я уже понял =) а ошибку так и не исправили
чуть чуть подправил для удобства отображения
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
static void Main(string[] args)
        {
            Random r = new Random();
            int k = r.Next(0, 255);
 
            //исходный байт
            byte b = Convert.ToByte(k);
 
            int bi = Convert.ToInt32(b);
            string hex = Convert.ToString(b, 2);
            string num = hex;
            while (num.Length < 8)
            {
                num = "0" + num;
            }
            Console.WriteLine("Исходный  байт");
            Console.WriteLine(Convert.ToString(b));
            Console.WriteLine(num);
            char[] CH = new char[8];
            int index = CH.Length - hex.Length;
            hex.CopyTo(0, CH, index, hex.Length);
            //заменяем нули на единици и наоборот в 1 и 5 битах
            if (CH[7] == '1')
                bi = bi - 1;//отнимаем вес первого бита
            else
                bi = bi + 1;//прибавляем вес первого бита 
            if (CH[2] == '1')
                bi = bi - 32;//отнимаем вес пятого бита
            else
                bi = bi + 32;//прибавляем вес пятого бита
 
            //РЕЗУЛЬТАТ
            byte output = Convert.ToByte(bi);
            string outp = Convert.ToString(output, 2);
            while (outp.Length < 8)
            {
                outp = "0" + outp;
            }
            Console.WriteLine("Байт после замены 1 и 5 битов");
            Console.WriteLine(Convert.ToString(output));
            Console.WriteLine(outp);
            Console.ReadKey();
 
        }
0
Заблокирован
20.01.2010, 18:23
Какую ошибку? Я же написал первый справа - это нулевой бит. Соответственно второй справо - будет первым
0
34 / 21 / 2
Регистрация: 31.03.2009
Сообщений: 362
20.01.2010, 18:24  [ТС]
эм, как это нулевой? у меня он разный в зависимости от числа, вы запустите мой вариант и убедитесь в том что все верно
0
Заблокирован
20.01.2010, 18:28
Делай, как знаешь.
0
9 / 9 / 0
Регистрация: 13.01.2010
Сообщений: 32
23.01.2010, 13:29
Цитата Сообщение от ssv_www Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
static void Main(string[] args)
        {
            Random r = new Random();
            int k = r.Next(77,255);
 
            //исходный байт
            byte b =Convert.ToByte(k);
 
            int bi = Convert.ToInt32(b);
            string hex = Convert.ToString(b, 2);
            Console.WriteLine("Исходный  байт");
            Console.WriteLine(Convert.ToString(b, 2));
            char[] CH = new char[8];
            int i = CH.Length-1;
            int index = CH.Length - hex.Length;
            hex.CopyTo(0, CH, index, hex.Length);
            //заменяем нули на единици и наоборот в 1 и 5 битах
            if (CH[6] == '1')
                bi = bi - 2;//отнимаем вес первого бита
            else
                bi = bi + 2;//прибавляем вес первого бита 
            if (CH[2] == '1')
                bi = bi - 32;//отнимаем вес пятого бита
            else
                bi = bi + 32;//прибавляем вес пятого бита
 
            //РЕЗУЛЬТАТ
            byte output = Convert.ToByte(bi);
 
            Console.WriteLine("Байт после замены 1 и 5 битов");
            Console.WriteLine(Convert.ToString(output, 2));
            Console.ReadKey();
 
        }
а может так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
static void Main(string[] args)
    {
    const byte Mask = 0x22;
 
        Random r = new Random();
        //исходный байт
        byte b = Convert.ToByte(r.Next(77,255));
        Console.WriteLine("Исходный  байт: {0}",b);
        //заменяем нули на единицы и наоборот в 1 и 5 битах (маска 0x22)
    byte output = (byte)(b ^ Mask); // побитовое XOR (исключающее или)
    Console.WriteLine("Байт после замены 1 и 5 битов: {0}", output);
        Console.ReadKey();
    }
будет проще?
2
Заблокирован
23.01.2010, 22:49
Да, это получше будет. Но можно для наглядности сделать сделать так :
C#
1
2
3
4
...........
Console.WriteLine("Исходный  байт: {0}", Convert.ToString(b, 2));
...................
Console.WriteLine("Байт после замены 1 и 5 битов: {0}", Convert.ToString(output, 2));
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
23.01.2010, 23:17
Я делал так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//преобразование типа byte в массив битов
static bool[] ByteToBits(byte e)
        {
            bool[] bitarr=new bool[8];
            for (int bits = 0; bits < 8; bits++)
                bitarr[7 - bits] = ((e & (1 << bits)) != 0);
            return bitarr;
        }
 
//преобразование массива битов обратно в byte
static byte FastConvToByte(bool[] bits)
        {
            Array.Reverse(bits);
            if (bits.Length > 8)
                throw new ArgumentException("Array can contain maximum 8 values!");
            byte result = 0;
            for (byte i = 0; i < bits.Length; i++)
                if (bits[i])
                    result |= (byte)(1 << i);
            return result;
        }
 
//использование
void SomeFunc()
{
     byte x=123;
     bool[] bits=ByteToBits(x);
     bits[0]=false; //изменение 1 бита
     bits[4]=true;  //изменение 5 бита
     byte xnew = FastConvToByte(bits); //в xnew получим число с измененным 1 и 5 битами
}
Или использовать BitArray - использует меньше памяти, есть стандартные функции преобразования, но работает в несколько раз медленнее.
0
Заблокирован
23.01.2010, 23:44
Все-таки, в данном случае у vdmk наилучший вариант. Я тоже хотел использовать маску, только не много по-другому, отдельно для 1 и 5 бита. И не через XOR, а через AND. Но оказалось все можно сделать намного проще.
0
)))
 Аватар для aleks_pilipenko
610 / 423 / 55
Регистрация: 31.12.2009
Сообщений: 2,334
Записей в блоге: 3
11.11.2011, 20:26
Не знаешь как вытащить биты с 3 по 5 в переменную без цикла?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.11.2011, 20:26
Помогаю со студенческими работами здесь

Создание строки из массива битов
Подскажите как перевести массив битов обратно в Строку? String s = &quot;dfsdf&quot;; byte strBytes = Encoding.Unicode.GetBytes(s); ...

Из битов в двоичное представление числа
У меня есть класс для работы с битовыми массивами. Не получается сделать метод для перевода из бинарной в десятичную системы (необходимо...

Подсчет нулевых битов массива
Есть класс для битового массива, свойство CountZero нормально считает нулевые биты, если весь массив нулевой. Стоит хотя бы один бит...

Установка конкретных битов в байте
Привет народ! Необходимо в байт записывать конкретные биты. Причем данные еще разбиты на 4 кадра. Допустим 1 байт = 8 бит = 4 кадра по 2...

Блоковая запись в файл битов
Привет! Помогите, пожалуйста, переделать немного код. Нужно чтобы рандомные числа и запись в файл происходила блоками, а не побайтно. Знаю,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru