Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Байты в биты


Автор: arkonst 28.11.2007, 16:00
Здравствуйте коллеги!

Подскажите пожалуйста,каким образом можно байт разложить на составляющие биты. 1байт в 8 бит???
допустим у меня есть число 7 в 8-битном формате 00000111, каким образом можно было бы с помощью языка C# вытащить эти три единицы чтобы затем их использовать ...

Заранее спасибо за ответ.

Автор: nikakoi 28.11.2007, 16:09
Побитовыми операторами >> и << пользоваться не пробовал?smile

Автор: 1stain 28.11.2007, 16:12
поиском пользоваццо не прбовал?
http://forum.vingrad.ru/act-Search/CODE/show/searchid-4471d38762be1e149e9061462b3dac93/search_in-posts/result_type/topics/flag/search/highlite/%25D0%25B1%25D0%25B0%25D0%25B9%25D1%2582%25D1%258B+%25D0%25B2+%25D0%25B1%25D0%25B8%25D1%2582%25D1%258B/index.html

Автор: arkonst 28.11.2007, 16:13
да в общем то пробовал....но эти ж операторы сдвигают биты туда сюда....а как именно разложить байт в биты...а точнее из 8 бит вытянуть нужные и затем использовать...я новичок в программировании поэтому и спрашиваю....и жду ответа а не стеба

Автор: nikakoi 28.11.2007, 16:55
Код

BYTE x = 7;

for(int i = 0; i < 8; i++)
{
  if((x & 1 << i) == 0) 
  {
     smth;
  }
}


Ну кажется вот так можно понять где единицы и где нули=)

Добавлено через 1 минуту и 10 секунд
Если я конечно ничего не напутал... Что вполне вероятно, ибо сам довольно недавно на C# пишу)
а как ты их использовать хочешь?)

Автор: arkonst 28.11.2007, 17:10
Я пишу программу для работы с устройством в modbus протоколе....так вот...у меня есть функции для чтения holding и input(байты-аналоговые величины)), а вот для чтения coil и discret(биты-дискретные ) нет.

В modbus есть такая функция - 01 она для чтения Coil. ЕЕ я и пытаюсь реализовать, на основе функции для чтения holding (03) , в этой функции используються операции для работы с байтами. А мне как раз чтобы получить состояния Coil нужно сначала вытащить байт из сообщения modbus, затем разложить его на составляющие биты....они и будут являться битами состояния выходов устройства, а затем их уже вывести на форму,типа SCADA получаеться...только для одного устройства...

Автор: 1stain 28.11.2007, 17:50
arkonst, чесно сказать мало что понял, дурак наверное  smile 
могу предложить такой вариант: не заморачиваться с >> & <<, а преобразовывать байт в экземпляр перечисления с атрибутом [Flags]
проще это показать на примере:
Код

    [Flags]
    enum TipaSCADAonlyForOneDeviceEnum : byte
    {
        NOTHING = 0,

        FIRSTBIT = 0x01,
        SECBIT = 0x02,
        THIRDBIT = 0x04,
        FOURTHBIT = 0x08,
        FIFTHBIT = 0x10,
        SIXTHBIT = 0x20,
        SEVENTHBIT = 0x40,
        EIGTHBIT = 0x80

        //можно и так
        //,FIRST_and_THIRD = 0x5
    }

    static void Main(string[] args)
    {
        
        byte b = 4;
        byte bb = 7;
        Console.WriteLine(((TipaSCADAonlyForOneDeviceEnum)b).ToString());
        Console.WriteLine(((TipaSCADAonlyForOneDeviceEnum)bb).ToString());

        TipaSCADAonlyForOneDeviceEnum tipaBB = (TipaSCADAonlyForOneDeviceEnum)bb;

        if (tipaBB & TipaSCADAonlyForOneDeviceEnum.THIRDBIT != TipaSCADAonlyForOneDeviceEnum.NOTHING)
            Console.WriteLine("Третий бит установлен");
     }


з.ы. лучше задать экземплярам перечисления соответствующие имена битов протокола

Автор: arkonst 29.11.2007, 10:32
Хорошо...тогда как используя побитовый оператор << >> можно выделить нужный бит....например из 00000111 выделить предпоследнюю единицу,?? желательно на примере.

Автор: Freak_FB 24.4.2008, 11:15
Не понял, зачем [Flags]...
А как насчёт разбить твой байт в BitArray ?
http://forum.vingrad.ru/forum/topic-206044/kw-bitarray-byte/hl/bitarray/index.html...

Код

BitArray ba = new BitArray(new byte[] { 5 });


Получаем потом каждый бит в виде булевого значения true/false. Типа ba[0] и так дальше.

Автор: mr.DUDA 24.4.2008, 12:49
Freak_FB, теме полгода уже.  smile 

Автор: Freak_FB 24.4.2008, 12:50
Блин... не увидел дату поста... туплю....

Автор: mr.DUDA 24.4.2008, 12:56
Цитата(Freak_FB @  24.4.2008,  12:50 Найти цитируемый пост)
Теме полгода (не, меньше, конечно), но никто же её не удосужился поискать, перед тем как новый топик добавлять. Или я не прав?

Я вообще не понял о каком новом топике речь и зачем поднимать пыльные темы. Кому нужен ответ на похожий вопрос, найдёт его поиском или по быстрым ссылкам.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)