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.

зы.
хорошо потрудились. спасибо.
желаю каждому фортеру взаимопонимания и сотрудничества с другими братьями по разуму :D

Автор:  chu [ Сб май 04, 2019 09:15 ]
Заголовок сообщения:  Re: поможите с переводом

на всякий случай, чтоб не потерялась

Страница 2 из 2 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/