Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.08.2012, 01:08   #1
Tiva
Пользователь
 
Регистрация: 23.11.2011
Сообщений: 49
По умолчанию непонятный кусок кода на с++

есть кусок кода, который решает проблемы, с пакетом-переростком, который обнаруживается при парсинге
Код:
// We dont know yet if we have normal or big packet
uint8 header[5]; 
memset(header, 0, 5); 

// Read the first byte to find out
m_socket.Read((char*)&header, 1); 
m_crypt.DecryptRecv(header, 1); 

if (header[0] & 0x80) // если в хедер записался 1ый байт и сравним с каким-то 0х80 
{ // Big packet
m_socket.Read((char*)&header + 1, 4);
m_crypt.DecryptRecv(header + 1, 4); 


m_remaining = (((header[0] & 0x7F) << 16) | (header[1] << 8) | header[2]);
assert(m_remaining > 0x7FFF); // It should be normal packet, so something went wrong..
m_opcode = (header[3] | (header[4] << 8));
}
else

{ // Normal packet
m_socket.Read((char*)&header + 1, 3);
m_crypt.DecryptRecv(header + 1, 3);

m_remaining = ((header[0] << 8) | header[1]);
m_opcode = (header[2] | (header[3] << 8));
}
мне абсолютно не понятно, что делают вот эти строчки
Код:
if (header[0] & 0x80) // что это за if такой
{ // Big packet
...
m_remaining = (((header[0] & 0x7F) << 16) | (header[1] << 8) | header[2]);
assert(m_remaining > 0x7FFF); // It should be normal packet, so something went wrong..
m_opcode = (header[3] | (header[4] << 8));
воооообще не могу понять эти строчки
Tiva вне форума Ответить с цитированием
Старый 27.08.2012, 03:36   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

if (header[0] & 0x80) // что это за if такой
если в 7 бите числа(считай с младших разрядов) единица - условие истинно.
0x80 = 128 в десятичной СС (поэтому 7 бит), & - битовое И

дальше примерно тоже самое... (((header[0] & 0x7F) << 16)
<< битовый сдвиг
7F = 127, т.е. на header[0] накладывается маска, и берутся неизменными только 6 младших разрядов. Берутся и сдвигаются влево на 16 разрядов

Вобщем почитай про всякие побитовые операции, цитировать тут учебники смысла нет.
rrrFer вне форума Ответить с цитированием
Старый 27.08.2012, 08:40   #3
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Кстати, просто замечу, что запись вида
Код:
0xdddd...
является записью числа в шестнадцатеричной системе счисления. Для человека оно представимо как 16-чное число dddd....
Например,
0x2[16] = 2[10]
0x9[16] = 6[10] // вот тут опечатка. Не буду исправлять уже.
0xFF[16] = 255[10]
0x42[16] = 66[10]

В квадратных скобках указано основание системы счисления.

Последний раз редактировалось Вадим Мошев; 27.08.2012 в 17:23.
Вадим Мошев вне форума Ответить с цитированием
Старый 27.08.2012, 09:00   #4
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
0x9[16] = 6[10]
эээ... Вадим, а вы в этом уверены?
насколько я помню, 0x9[16] = 0x9[10]
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 27.08.2012, 17:22   #5
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Цитата:
Сообщение от DiemonStar Посмотреть сообщение
эээ... Вадим, а вы в этом уверены?
насколько я помню, 0x9[16] = 0x9[10]
Очепятался...
Последнее время я все числа набираю на цифровой клавиатуре, а там цифры 6 и 9 стоят рядом.

Кстати, а почему вы записали десятичное число как 0x9?
Вадим Мошев вне форума Ответить с цитированием
Старый 27.08.2012, 17:38   #6
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
Кстати, а почему вы записали десятичное число как 0x9?
1:1
больше привык к записям типа 09h = 9d
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 27.08.2012, 19:12   #7
Tiva
Пользователь
 
Регистрация: 23.11.2011
Сообщений: 49
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
if (header[0] & 0x80) // что это за if такой
если в 7 бите числа(считай с младших разрядов) единица - условие истинно.
0x80 = 128 в десятичной СС (поэтому 7 бит), & - битовое И

дальше примерно тоже самое... (((header[0] & 0x7F) << 16)
<< битовый сдвиг
7F = 127, т.е. на header[0] накладывается маска, и берутся неизменными только 6 младших разрядов. Берутся и сдвигаются влево на 16 разрядов

Вобщем почитай про всякие побитовые операции, цитировать тут учебники смысла нет.
спасибо за разъяснения!
а может кто переписать этот кусок кода, эти строчки на object pascal или FS(fastcript)?

мой аналог на фастскрипте(похож на обжект паскаль вроде) не работает
вот привожу что есть:
Код:
begin
  // result :=  false; - автопарсинг после ф-ции не производится.
  result := false;
  if gSys.tParse = 0 then begin
    _dParsePck := _dParseBuff;
    _dParseBuff := '';
  end else if gSys.tParse = 4 then begin // обратный 2-bytes packet size + crypted
    sz := length(_dParseBuff);

    if sz >= 6 then begin //  если в буфере есть >= 6 байт
      ss1 := copy(_dParseBuff,1,6);
      
      if _dFromServ then begin // декодируем размер
        ss := fw_sRC4Data;
        if not _flagFirstS then gCrypt.RC4Crypt(fw_sRC4Data, ss1, 4);
        w := ord(ss1[1])*256 + ord(ss1[2])+2; // взяли размер
        fw_sRC4Data := ss; // откатим ключи обратно
      end else begin
        ss := fw_cRC4Data;
        if not _flagFirstC then gCrypt.RC4Crypt(fw_cRC4Data, ss1, 6);
        w := ord(ss1[1])*256 + ord(ss1[2])+2; // взяли размер
        fw_cRC4Data := ss;
      end;
      //

      //
      if w = sz then begin
        _dParsePck := _dParseBuff;
        _dParseBuff := '';
      end else if w < sz then begin
        _dParsePck := copy(_dParseBuff,1,w);
        _dParseBuff := copy(_dParseBuff, w+1, sz-w);
        ////writelogln(length(_dParseBuff));
      end;
    end;
  end else result := true;
end;
Tiva вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевести кусок кода из C++ в Delphi jhonyxakep Общие вопросы Delphi 2 25.09.2011 08:28
Кусок кода не хочет работать. Yagamy Liet Общие вопросы Delphi 31 19.08.2010 11:49
Нужен ли данный кусок кода? iankov PHP 4 23.04.2009 20:49
помогите понять кусок кода Arteom БД в Delphi 7 31.08.2007 08:51
Есть кусок кода komarevsky Общие вопросы Delphi 7 19.07.2007 17:43