Forth http://fforum.winglion.ru/ |
|
поможите с переводом http://fforum.winglion.ru/viewtopic.php?f=39&t=2959 |
Страница 2 из 2 |
Автор: | KPG [ Вс авг 19, 2018 12:42 ] |
Заголовок сообщения: | Re: поможите с переводом |
Согласно информации c данной странички Оптимизированный расчёт CRC-16 CCITT на языке Си, полином 0x8408 отличается от классического CRC-16, так как использует другой полином и порядок данных. Код: /* Name : CRC-16 CCITT Poly : 0x8408 Init : 0xFFFF Revert: false XorOut: 0x0000 Check : 0x6F91 ("123456789") MaxLen: 4095 байт (32767 бит) - обнаружение одинарных, двойных, тройных и всех нечетных ошибок */ unsigned short crc_ccitt_update (unsigned short crc, unsigned char data) { unsigned short t; data ^= crc&255; data ^= data << 4; t = (((unsigned short)data << 8) | ((crc>>8)&255)); t ^= (unsigned char)(data >> 4); t ^= ((unsigned short)data << 3); return t; } Форт код Код: : crc-ccitt ( crc data -- crc' ) OVER 0xFF AND XOR DUP 4 LSHIFT XOR 0xFF AND >R 8 RSHIFT 0xFF AND R@ 8 LSHIFT OR R@ 4 RSHIFT XOR R> 3 LSHIFT XOR 0xFFFF AND ; этот же crc16 (из SwiftForth) Код: 0x8408 CONSTANT Poly16 : CRC16 ( crc data -- crc' ) XOR 8 0 DO DUP 1 AND 0<> Poly16 AND SWAP 1 RSHIFT XOR LOOP ; P.S. Похоже это и есть алгоритм из обсуждения в начале топика. CRC-16/MCRF4XX - название в crc калькуляторе Catalogue of parametrised CRC algorithms with 16 bits online crc калькуляторы разные в i-nete представлены... Тоже большой калькулятор crc Для Verilog ... По циклическим кодам - одна из хороших книг Блейхут Р.Э. Теория и практика кодов, контролирующих ошибки. |
Автор: | KPG [ Пн авг 20, 2018 00:00 ] |
Заголовок сообщения: | Re: поможите с переводом |
Код: : crc-ccitt ( crc data -- crc' ) OVER 0xFF AND XOR \ data ^= (crc & 255); DUP 4 LSHIFT XOR \ data ^= data << 4; 0xFF AND DUP DUP 3 LSHIFT >R 0xFF AND 4 RSHIFT >R 8 LSHIFT SWAP 8 RSHIFT OR R> XOR R> XOR 0xFFFF AND ; Добавил пару команд в исходный алгоритм и получилось его идентифицировать как CRC-16/X-25 (IN =0xFFFF Xor=0xFFFF) или CRC-16/MCRF4XX (IN=0xFFFF 0) P.S. И дополнительно для разнообразия (хотя CRC32 есть в devel SPF4) пара вариантов подсчёта CRC32 Код: \ This code can implement other types of CRC by using other polynomial constants: \ use $8408 for CCITT CRC-16, or $a001 for IBM CRC-16. : crc/ ( n -- n ) 8 0 DO DUP 1 RSHIFT SWAP 1 AND IF 0xEDB88320 XOR THEN LOOP ; : crcfill 256 0 DO I crc/ , LOOP ; CREATE crctbl crcfill : crc32 ( crc n -- crc' ) OVER XOR 0xFF AND CELLS crctbl + @ SWAP 8 RSHIFT XOR ; Код: 0xEDB88320 CONSTANT Poly32 \ Bit-reversed polynomial
: CRC32 ( crc data -- crc' ) XOR 8 0 DO DUP 1 AND 0<> Poly32 AND SWAP 1 RSHIFT XOR LOOP ; |
Автор: | chu [ Пн авг 20, 2018 12:37 ] |
Заголовок сообщения: | Re: поможите с переводом |
KPG писал(а): Добавил пару команд в исходный алгоритм и получилось его идентифицировать как CRC-16/X-25 (IN =0xFFFF Xor=0xFFFF) или CRC-16/MCRF4XX (IN=0xFFFF 0) и CRC-16/KERMIT (IN =0x0000 0) в mecrisp'e скорострельность на тестовой строке Код: tst ' $crc count-ticks ok. . 1333 ok. w0x.r 0000 2189 ok. зы. хорошо потрудились. спасибо. желаю каждому фортеру взаимопонимания и сотрудничества с другими братьями по разуму |
Автор: | chu [ Сб май 04, 2019 09:15 ] |
Заголовок сообщения: | Re: поможите с переводом |
на всякий случай, чтоб не потерялась |
Страница 2 из 2 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |