Разбот заголовка Ip

Тема в разделе ".NET", создана пользователем smertnik, 6 июн 2007.

  1. smertnik

    smertnik Гость

    Здравствуйте.

    Разъясните пожайлуста или скажите что почитать, что бы понять как работает:
    Код (Text):
    private void button1_Click(object sender, EventArgs e)
    {
    byte[] c = { 0x45, 0x00, 0x00, 0x53, 0x63, 0x31, 0x40, 0x00, 0x72, 0x06, 0x7A, 0x76, 0xCE, 0x7F, 0x9B, 0x84, 0xC0, 0xA8, 0x00, 0x51 }; // Заголовок 20 байт
    int nn = (int)ToUInt(c, 0, 4); // Возвращает версию протокола
    }
    public uint ToUInt(byte[] datagram, int offset, int length)
    {
    uint total = 0;
    int byte_index;
    int bit_offset;
    int bit;
    byte b;

    for (int i = 0; i < length; i++)
    {
    bit_offset = (offset + i) % 8; // Как я понял получаем начальный бит?
    // С этого момента для меня это какой то ужас :huh:
    byte_index = (offset + i - bit_offset) / 8;
    b = datagram[byte_index]; // В переменной b хранится нужная информация но только в байтах ?
    bit = (int)(b >> (7 - bit_offset));
    bit = bit & 0x0001;

    if (bit > 0)
    {
    total += (uint)Math.Pow(2, length - i - 1);
    }
    }
    return total;
    }
     
  2. mms

    mms Гость

    Первые четыре бита содержат версию, собственно приведенный метод возвращает цифру, которая хранится в length битах с offset отступом из данных datagram.

    Поехали:


    Код (Text):
                // анализируем все биты, их у нас четыре
    for (int i = 0; i < length; i++)
    {
    bit_offset = (offset + i) % 8; // ищем отступ текущего бита, относительно байта (точнее в байте)
    byte_index = (offset + i - bit_offset) / 8; // определяем индекс байта текущего бита
    b = datagram[byte_index]; // по индексу получаем байт
    bit = (int)(b >> (7 - bit_offset)); // выделяем непосредственно бит (сдвигаем бит к началу)
    bit = bit & 0x0001; // определяем чему он равен, 0 или 1

    if (bit > 0)
    {
    // переводим двоичный бит в цифру (бит номер 0 - 1, бит 1 - 2, бит 2 - 4 и т.д. :) )
    total += (uint)Math.Pow(2, length - i - 1);
    }
    }
    // возвращаем полученное значение
    return total;
     
  3. mms

    mms Гость

    Кстати, если надо только версию определить, то куда быстрее написать так:

    Код (Text):
    uint nn = (uint)(c[0] >> 4); // версия
     
  4. smertnik

    smertnik Гость

    Спасибо большое.
     

Поделиться этой страницей