Сейчас на форуме: zds (+5 невидимых)

 eXeL@B —› Программирование —› Помогите разобраться с кодом
Посл.ответ Сообщение


Ранг: 529.0 (!), 110thx
Активность: 0.290.04
Статус: Участник
5KRT

Создано: 08 января 2014 18:49
· Личное сообщение · #1

Столкнулся с не понятным моментом с коде одной функции:
Code:
  1. if(len & 1)
  2. end = (WORD*)((DWORD)buf+len-1);
  3. else
  4. end = (WORD*)(buf+len);

Кусок кода из функции подсчёта CRC32
Есть какие нибудь предположения, каков смысл этого условия?

-----
Research For Food





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 08 января 2014 19:08 · Поправил: reversecode
· Личное сообщение · #2

четная или не четная длинна
и соотвественно конец буффера разный по выравниванию

смысл - кто то пытался оптимизировать crc по скорости длине входного буффера

| Сообщение посчитали полезным: daFix

Ранг: 431.7 (мудрец), 390thx
Активность: 0.730.32
Статус: Участник

Создано: 08 января 2014 22:34 · Поправил: dosprog
· Личное сообщение · #3

Предположу, что подсчитывается сумма двух-байтовых слов (WORDs) в буфере, и лишний байт там неуместен.
Он, видимо, будет учтён при обработке следующей порции данных.
Дальше могло бы быть такое:
words = ((DWORD)end - (DWORD)buf)/2+1; curr=(WORD*)buf;
while( words-- ){ /*подсчёт crc порции в буфере*/ ....;curr++;}


| Сообщение посчитали полезным: daFix


Ранг: 529.0 (!), 110thx
Активность: 0.290.04
Статус: Участник
5KRT

Создано: 09 января 2014 03:08
· Личное сообщение · #4

Да да да, вы правы, просто некий Тихий товарищ меня смутил немного, но он потом сам догнал что заблуждался
Теперь всё понятно стало...
Code:
  1. if(len & 1)
  2. __CRC32FIX(CrcPtr, src, 1);

Видать, в этой функции берётся всего один байт. Просто у меня нету её кода и не мог понять зачем всё это надо.
Спасибо большое, парни!

-----
Research For Food



 eXeL@B —› Программирование —› Помогите разобраться с кодом
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати