Как произвольный байт на входе преобразовать в биты - C#

Узнай цену своей работы

Формулировка задачи:

Собственно, вопрос в заголовке )) Подскажите, пожалуйста! ))

Решение задачи: «Как произвольный байт на входе преобразовать в биты»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Collections;
using System.IO;
 
namespace ParseByte
{
    static class BitStream
    {
        static char[] bitbuffer = new char[4096]; //буфер
        static int cntWrite = 0; //счетчик на запись
 
        //Парсит байт в биты и записывает в буфер. Принимает байт и файловый поток
        static public void ByteToBit(byte[]masByte, BinaryWriter fs)
        {
            BitArray oneByte = new BitArray(masByte);
                foreach (bool bit in oneByte)
                {
                    if (bit && cntWrite < 4096) //если true
                    {
                        bitbuffer[cntWrite] = '1';
                        cntWrite++;
                    }
                    else if (!bit && cntWrite < 4096) //если false
                    {
                        bitbuffer[cntWrite] = '0';
                        cntWrite++;
                    }
                    else
                    {
                        fs.Write(bitbuffer, 0, bitbuffer.Length);
                        cntWrite = 0;
                        break;
                    }
                }
        }
 
        //Биты из файла в 512 байт
        static public void BitsTo512Byte(BinaryReader bread, FileStream fend)
        {
            char oneByte;
            int j = 0, check = 0, i;
            BitArray realBitBuffer = new BitArray(4096);
            BitArray tmp = new BitArray(8);
            byte[] bytes = new byte[512];
            
            for (i = 1; i < 4097; i++)
            {
                if ((check = bread.PeekChar()) != -1)
                {
                    oneByte = bread.ReadChar();
                    if (oneByte == '1')
                        realBitBuffer[i - 1] = true;
                    else if (oneByte == '0')
                        realBitBuffer[i - 1] = false;
                    else
                        Console.WriteLine("В байте неверное значение!");
                }
            }
            for (int k = 0; k < Math.Ceiling(realBitBuffer.Count/8.0); k++) //Делаем столько проходов, сколько раз у нас встречаются комбинации по 8 бит! Ceiling округляет до верхнего целого
              for (i = 0; i < 8 && j < realBitBuffer.Count; i++, j++)
              {
                  tmp[i] = realBitBuffer[j];
                  if (i == 7 || j == realBitBuffer.Count) // Пора сбрасывать биты в байт!
                      tmp.CopyTo(bytes, k); //парсим биты в байты, к - текущий индекс массива байтов bytes
              }
            BurnBytes(bytes, fend);
        }
 
        //Считываем весь файл с помощью BitsTo512Byte
        static public void ReadAllBits(BinaryReader bread, FileStream fend)
        {
            int i;
            while ((i = bread.PeekChar()) != -1)
                BitsTo512Byte(bread, fend);
        }
 
        //Записывает массив байтов на входе в файл
        static public void BurnBytes(byte[] bytes, FileStream fend)
        {
            foreach (byte b in bytes)
                fend.WriteByte(b);
        }
 
        //Все байты преобразовывает в биты через ByteToBit
        static public void AllBytesToBits(FileStream fs, BinaryWriter wout) //(откуда считывать, куда писать биты)
        {
            int bt;
            byte[] masByte = new byte[1];
            do
            {
                bt = fs.ReadByte();
                if (bt != -1)
                {
                    masByte[0] = (byte)bt;
                    ByteToBit(masByte, wout);
                }
            } while (bt != -1);
        }
    }
    
    class MainProgram
    {
        static void Main(string[] args)
        {
            string strChoise;
            int choise = 0;
            Console.WriteLine("Что вы желаете сделать: \n  1. Преобразовать файл в биты\n  2. Преобразовать биты в файл");
            Console.Write("Ваш выбор: ");
            strChoise = Console.ReadLine();
            choise = Int32.Parse(strChoise);
 
            switch (choise)
            {
                case 1:
                    try
                    {
                        Console.Write("Введите название файла, откуда считывать биты: ");
                        string strIn = Console.ReadLine();
                        FileStream fin = new FileStream(strIn, FileMode.Open);
                        Console.Write("Введите название файла, куда сохранять считанные биты: ");
                        string strOut = Console.ReadLine();
                        BinaryWriter fswrite = new BinaryWriter(new FileStream(strOut, FileMode.Create, FileAccess.Write));
                        BitStream.AllBytesToBits(fin, fswrite); //тут идет основная работа :)
                    }
                    catch (IOException exc)
                    {
                        Console.WriteLine("Ошибка работы с файлом:\n" + exc.Message);
                        Console.ReadKey();
                    }
                    break;
                case 2:
                    try
                    {
                        Console.Write("Введите название файла, откуда считывать биты: ");
                        string strIn = Console.ReadLine();
                        BinaryReader bread = new BinaryReader(new FileStream(strIn, FileMode.Open, FileAccess.Read));
                        Console.Write("Введите название и путь конечного файла: ");
                        string strOut = Console.ReadLine();
                        FileStream fend = new FileStream(strOut, FileMode.Create);
                        BitStream.ReadAllBits(bread, fend);
                    }
                    catch (IOException exc)
                    {
                        Console.WriteLine("Ошибка работы с файлом:\n" + exc.Message);
                        Console.ReadKey();
                    }
                    break;
 
            }
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.143 из 5
Похожие ответы