Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
13 / 9 / 4
Регистрация: 24.12.2020
Сообщений: 153

Работа с битами

25.04.2022, 13:46. Показов 1530. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, вопрос заключается в следующем.
На выходе алгоритма получается строка из 0 и 1, если эту строку просто записать в файл, то на каждый 0 или 1 выделится 1 байт. То есть фактически, до работы алгоритма файл весил, допустим, 136 бит(Примерно, 16 байт), то после работы мы получим 39 последовательных 0 и 1, что при записи превратится в 39 байт, как можно по другому записать 1 и 0 в файл, чтобы на выходе был файл размером как раз в 39 бит( ~5 байт), а не 39 байт?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.04.2022, 13:46
Ответы с готовыми решениями:

Работа с битами
Здравствуйте, необходимо считать данные из файла. В нем последовательно записаны 3 переменные :X=10 бит; Y = 10 бит и Z=12 бит. Я считал...

Работа с битами
Всем привет, ковыряю RLE и по мелочам работу с битами. С одной стороны есть List<bool> и BitArray, с другой это наверное...

Работа с битами числа
Не подскажите как можно инвертировать число?

13
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
25.04.2022, 14:08
Лучший ответ Сообщение было отмечено Leooos как решение

Решение

Цитата Сообщение от Leooos Посмотреть сообщение
как можно по другому записать 1 и 0 в файл, чтобы на выходе был файл размером как раз в 39 бит( ~5 байт), а не 39 байт?
Записывайте их не в строку, а в массив байтов. Каждый байт из массива будет хранить 8 битов.
Этот массив потом уже пишите в файл.
0
13 / 9 / 4
Регистрация: 24.12.2020
Сообщений: 153
25.04.2022, 15:07  [ТС]
Могли бы вы подсказать код для сие чуда или подсказать в каком направлении стоит искать?
0
56 / 39 / 20
Регистрация: 11.06.2021
Сообщений: 154
25.04.2022, 16:14
39 не делится на 8, последнее число добавлять надо или 1 или 0, а так, решение в лоб:
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
        static void Main(string[] args)
        {
            byte[] dataArray = new byte[40];
            Random rnd = new Random();
            string s = string.Empty;
            for (int i = 0; i < dataArray.Length ; i++)
            {
                dataArray[i] = (byte)rnd.Next(2);
                s += dataArray[i].ToString();
                Console.Write("{0} ", dataArray[i]);
            }
            Console.WriteLine();
            Console.WriteLine(s);
            int j = 0;
            byte[] Sbin = new byte[40/8];
            while (j < s.Length - 1)
            {
                Sbin[j/8] += (byte)Convert.ToInt32(s.Substring(j, 8), 2);
                j += 8;
            }
            for (int i = 0; i < Sbin.Length; i++)
            {
                Console.Write("{0} ", Sbin[i]);
            }
            using (FileStream
            fileStream = new FileStream("file.bin", FileMode.Create))
            {
                for (int i = 0; i < Sbin.Length; i++)
                {
                    fileStream.WriteByte(Sbin[i]);
                }
            }
        }
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
25.04.2022, 16:28
Цитата Сообщение от Leooos Посмотреть сообщение
Могли бы вы подсказать код для сие чуда или подсказать в каком направлении стоит искать?
Покажите как вы формируете строку из 1 и 0 — начинать нужно оттуда, заменив создание строки на запись битов в массив.
0
13 / 9 / 4
Регистрация: 24.12.2020
Сообщений: 153
25.04.2022, 16:49  [ТС]
filh

Спасибо за решение в лоб, буду честен, скопипастил и добавил приписывание 1 в конце, однако наткнулся на ошибку, что нет узнаваемых цифр "could not find any recognizable digits"

У меня переменная Code получает все 0 и 1, в неё же и добавляю недостающие до деления без остатка на 8.

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
 foreach (char a in message)
            {
                Code += Codes[a];
                
            }
            while (Code.Length%8 != 0)
            {
                Code = Code + "1";
            }
            byte[] dataArray = new byte[Code.Length];
            string q = string.Empty;
            for (int i = 0; i < dataArray.Length; i++)
            {
                dataArray[i] = (byte)Code[i];
                q += dataArray[i].ToString();
                Console.Write("{0} ", dataArray[i]);
            }
            Console.WriteLine();
            Console.WriteLine(q);
            int j = 0;
            byte[] Sbin = new byte[Code.Length / 8];
 
            [B]Ошибка возникает здесь, при последнем проходе цикла While [/B]
            while (j < Code.Length-1 )
            {
                Sbin[j / 8] += (byte)Convert.ToInt32(s.Substring(j, 8), 2);
                j += 8;
            }
            for (int i = 0; i < Sbin.Length; i++)
            {
                Console.Write("{0} ", Sbin[i]);
            } 
            using (FileStream
            fileStream = new FileStream("file.bin", FileMode.Create))
            {
                for (int i = 0; i < Sbin.Length; i++)
                {
                    fileStream.WriteByte(Sbin[i]);
                }
            }
Добавлено через 3 минуты
kolorotur

C#
1
2
3
4
5
 foreach (char a in message)
            {
                Code += Codes[a];
                
            }
Как-то так, message - переменная принимающая в себя текст из файла, Сode - переменная для этого текста, а Сodes(словарь, хранящий в себе элемент и его код) - результат работы алгоритма Шеннона-Фано
0
56 / 39 / 20
Регистрация: 11.06.2021
Сообщений: 154
25.04.2022, 16:56
Leooos, в 26 строчке s.Substring, а выше используется string q = string.Empty;
0
13 / 9 / 4
Регистрация: 24.12.2020
Сообщений: 153
25.04.2022, 17:07  [ТС]
filh
Исправил, но, к сожалению, проблемы это не решило, так же на последней итерации ошибка
0
56 / 39 / 20
Регистрация: 11.06.2021
Сообщений: 154
25.04.2022, 17:21
Leooos, Code это строка? Тогда в 26 строке не q а Code и часть кода лишние
0
13 / 9 / 4
Регистрация: 24.12.2020
Сообщений: 153
25.04.2022, 17:24  [ТС]
filh

Прошел я значит дебагером и увидел вот что, в переменную q он пишет 484849.... и так далее, разве тут не 0, 1 должны быть?
0
56 / 39 / 20
Регистрация: 11.06.2021
Сообщений: 154
25.04.2022, 17:34
Leooos, это лишний код, у меня заполнялась рендомна строка. С 10 до 19 строки не нужны, переменная Code уже строка с 011001 ну и т.д.

Добавлено через 6 минут
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
            foreach (char a in message)
            {
                Code += Codes[a];
 
            }
            while (Code.Length % 8 != 0)
            {
                Code = Code + "1";
            }
            int j = 0;
            byte[] Sbin = new byte[Code.Length / 8];
            while (j < Code.Length - 1)
            {
                Sbin[j / 8] += (byte)Convert.ToInt32(Code.Substring(j, 8), 2);
                j += 8;
            }
            for (int i = 0; i < Sbin.Length; i++)
            {
                Console.Write("{0} ", Sbin[i]);
            }
            using (FileStream
            fileStream = new FileStream("file.bin", FileMode.Create))
            {
                for (int i = 0; i < Sbin.Length; i++)
                {
                    fileStream.WriteByte(Sbin[i]);
                }
            }
0
13 / 9 / 4
Регистрация: 24.12.2020
Сообщений: 153
25.04.2022, 17:57  [ТС]
filh
Спасибо за помощь! Все заработало, не уже ли архивирование стало работать как надо, а не увеличивать размер файла)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
26.04.2022, 18:27
Цитата Сообщение от Leooos Посмотреть сообщение
как можно по другому записать 1 и 0 в файл, чтобы на выходе был файл размером как раз в 39 бит( ~5 байт), а не 39 байт?
Методы расширения:
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
45
46
namespace Core2022
{
    public static partial class ExtensionMethods
    {
        /// <summary>Сжимаете биты записанные в отдельные байты в байтовый массив.</summary>
        /// <param name="bits">Байты каждый из которых содержит один бит.
        /// Бит считается установленным если байт не равен нулю. </param>
        /// <returns>Возвращает байтовый массив, отражающий исходную битовую последовательность.</returns>
        public static byte[] BitsZip(this byte[] bits)
        {
            int length = ((bits.Length - 1) / 8) + 1; // Длина выходного байтового массива.
            byte[] bytes = new byte[length]; // Выходной массив байт.
            for (int i = 0; i < bits.Length; i++) // Перебор всех бит.
            {
                // Если бит не равен нулю, то подъём соответствующего бита в выходном массиве.
                if (bits[i] != 0)
                {
                    bytes[i / 8] |= (byte)(1 << (i % 8));
                }
            }
            return bytes;
        }
 
        /// <summary>Разжимает байтовый массив в массив байтов для каждого бита.</summary>
        /// <param name="bytes">Байты каждый бит которых надо отразить в отдельный байт.</param>
        /// <returns>Возвращает байтовый массив каждый из которых содержит отдельный бит.</returns>
        public static byte[] BitsUnzip(this byte[] bytes)
        {
            int length = bytes.Length * 8; // Длина выходного битового массива.
            byte[] bits = new byte[length]; // Выходной массив бит.
 
            for (int i = 0; i < bits.Length; i++) // Перебор всех бит.
            {
                // Если бит не равен нулю, то запись 1 в соответствующей бит в выходном массиве.
                if ((bytes[i / 8] & (1 << (i % 8))) != 0)
                {
 
                    bits[i] = 1;
                }
            }
            return bits;
        }
 
    }
 
}
Тест:
C#
1
2
3
4
5
6
7
8
9
10
11
Random random = new Random();
 
byte[] bits = Enumerable.Range(0, 39).Select(i => (byte)random.Next(2)).ToArray();
 
byte[] bytes = bits.BitsZip();
 
byte[] bits1 = bytes.BitsUnzip();
 
Console.WriteLine(string.Join(' ', bits));
Console.WriteLine(string.Join(' ', bytes.Select(b => string.Concat(Convert.ToString(b, 2).PadLeft(8, '0').Reverse()))));
Console.WriteLine(string.Join(' ', bits1));
0
13 / 9 / 4
Регистрация: 24.12.2020
Сообщений: 153
27.04.2022, 12:36  [ТС]
Элд Хасп

Cпасибо за помощь и подробное объяснение в комментариях к коду!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.04.2022, 12:36
Помогаю со студенческими работами здесь

Работа с битами
Здравствуйте! Подскажите, как работать с битами данных. у меня есть данные и мне нужно иметь возможность изменять с них биты. Как это...

Работа с битами И Работа с символьными данными
1. Ввести 8 символов. В символе с наибольшим кодом заменить 5-й бит единицей, а в символе с наименьшим кодом 6-й бит - нулем. Вывести...

Работа с битами
есть некоторый char используется как байт. есть переменная int x, в которой содержится номер бита со значением y. как записать этот...

Работа с битами.
Здрасте. Дана задача: Определить на сколько в числе А больше значущих битов, что равны единице, чем битов, что равны нулю. Помогите...

Построить слово, каждый бит которого зависит от того, совпадают ли младшие триады одноименных байтов двух массивов
Доброго времени суток! Среди вас есть, кто работает c tasm ом ? Построить слово, каждый бит которого равен I или 0 в зависимости от...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[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
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru