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

  • Автор темы smertnik
  • Дата начала
S

smertnik

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

Разъясните пожайлуста или скажите что почитать, что бы понять как работает:
Код:
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;
}
 
M
#2
Первые четыре бита содержат версию, собственно приведенный метод возвращает цифру, которая хранится в length битах с offset отступом из данных datagram.

Поехали:


Код:
			// анализируем все биты, их у нас четыре
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;
 
M
#3
Кстати, если надо только версию определить, то куда быстрее написать так:

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