Что нового

Инициализация таблицы для CRC16

edyapd

Осваивающий
Сообщения
380
Репутация
30
Для подсчета CRC блока данных требуется создать таблицу.
Вот то что нашел в инете:
Код:
Word MakeCRC16Table(void)
{
 Word r;
  for(int i=0; i<256; i++)
   {
    r = ((Word)i)<<8;
     for(byte j=0; j<8; j++)
       {
        if(r&(1<<15)) r=(r<<1)^0xA001;
        else r=r<<1;
       }
     crctable[i]=r;
   }
}
Должен получится массив: 0x0000, 0xC1C0, 0x81C1 .... и т.д.
То что я передал AutoIT:
Код:
Func MakeCRC16Table()
	Local $r, $poly = 0xA001
	For $i = 0 To 255
		$r = BitAND(BitShift($i, -8), 0xFFFF) ; Отсекаем старшие разряды
		For $j = 0 To 7
			MsgBox(0, $j, "r= " & Hex($r, 4))
			If BitAND($r, 0x8000) Then
				$r = BitAND(BitShift($r, -1), 0xFFFF)
				$r = BitXOR($r, $poly)
				$r = BitAND($r, 0xFFFF)
			Else
				$r = BitAND(BitShift($r, -1), 0xFFFF)
			EndIf
		Next
		MsgBox(0, " ", Hex($r, 4))
	Next
EndFunc

И получаю последовательность 0x0000, 0xA001
Подскажите где ошибся, а то в Си не силен.
 

ynbIpb

Скриптер
Сообщения
399
Репутация
110
может подойдёт готовый вариант?
CRC16/32, есть возможность указать свой полином
 
Автор
E

edyapd

Осваивающий
Сообщения
380
Репутация
30
Спасибо. Считает. Но надо разбираться как работает. Что такое "$Initial" вообще не пойму. А от него меняется CRC на выходе.
 

VladUs

Скриптер
Сообщения
621
Репутация
181
Интересно а как изменить контрольную сумму (CRC32) файла ?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
VladUs
он считывается из содержимого. не меняя содержимое не изменить и контрольную сумму, название которой как бе намекает
 

VladUs

Скриптер
Сообщения
621
Репутация
181
Kaster
Я это как бы понял. Без изменения содержимого файла нельзя изменить котрольную сумму. Я даже знаю и то, чтобы задать нужную контрольную сумму (СRС32) содержимое файла необходимо изменить, путем дозаписи, в конец файла 4 байтов. По крайней мере так работает всем известный PEiD.exe, а конкретнее его плагин CRC32,
который позволяет вычислять и изменять на нужную, контрольную сумму файла. Было бы неплохо заиметь такую функцию в Autoit. :smile:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
VladUs
аа. ну я просто не знаком с таким методом. но если известно что за байты дозаписываются, то проблем не должно возникнуть. простым перебором это не решить.
 

VladUs

Скриптер
Сообщения
621
Репутация
181
Kaster

В том то и дело что байты каждый раз совершенно разные, т.к. зависят от изначальной контрольной суммы.
Хорошо эту тему раскрыл Крис Касперски http://www.xakep.ru/magazine/xa/090/122/1.asp
 
Верх