Автор |
Сообщение |
|
|
Заголовок сообщения: |
Re: поможите с переводом |
|
|
[url=http://we.easyelectronics.ru/STM32/crc32-na-stm32-kak-na-kompe-ili-na-kompe-kak-na-stm32.html#comment180651]на всякий случай, чтоб не потерялась[/url]
|
|
|
|
Добавлено: Сб май 04, 2019 09:15 |
|
|
|
|
|
Заголовок сообщения: |
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. зы. хорошо потрудились. спасибо. желаю каждому фортеру взаимопонимания и сотрудничества с другими братьями по разуму
[quote="KPG"] Добавил пару команд в исходный алгоритм и получилось его идентифицировать как CRC-16/X-25 (IN =0xFFFF Xor=0xFFFF) или CRC-16/MCRF4XX (IN=0xFFFF 0) [/quote] и CRC-16/KERMIT (IN =0x0000 0) в [b]mecrisp[/b]'e скорострельность на тестовой строке [code] tst ' $crc count-ticks ok. . 1333 ok. w0x.r 0000 2189 ok.[/code] зы. хорошо потрудились. спасибо. желаю каждому фортеру взаимопонимания и сотрудничества с другими братьями по разуму :D
|
|
|
|
Добавлено: Пн авг 20, 2018 12:37 |
|
|
|
|
|
Заголовок сообщения: |
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 ;
[code] : 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 ; [/code] Добавил пару команд в исходный алгоритм и получилось его идентифицировать как CRC-16/X-25 (IN =0xFFFF Xor=0xFFFF) или CRC-16/MCRF4XX (IN=0xFFFF 0)
P.S. И дополнительно для разнообразия (хотя CRC32 есть в devel SPF4) пара вариантов подсчёта CRC32 :) [code] \ 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 ; [/code] [code] 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 ; [/code]
|
|
|
|
Добавлено: Пн авг 20, 2018 00:00 |
|
|
|
|
|
Заголовок сообщения: |
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 bitsonline crc калькуляторы разные в i-nete представлены... Тоже большой калькулятор crc Для Verilog... По циклическим кодам - одна из хороших книг Блейхут Р.Э. Теория и практика кодов, контролирующих ошибки.
Согласно [url=https://ru.wikibooks.org/wiki/%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%BE%D0%B2/%D0%A6%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B8%D0%B7%D0%B1%D1%8B%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4]информации c данной странички[/url]
Оптимизированный расчёт CRC-16 CCITT на языке Си, полином 0x8408 отличается от классического CRC-16, так как использует другой полином и порядок данных. [code] /* 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; } [/code] Форт код [code] : 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 ; [/code] этот же crc16 (из SwiftForth) [code] 0x8408 CONSTANT Poly16
: CRC16 ( crc data -- crc' ) XOR 8 0 DO DUP 1 AND 0<> Poly16 AND SWAP 1 RSHIFT XOR LOOP ; [/code]
P.S. Похоже это и есть алгоритм из обсуждения в начале топика. CRC-16/MCRF4XX - название в crc калькуляторе :) [url=http://reveng.sourceforge.net/crc-catalogue/16.htm]Catalogue of parametrised CRC algorithms with 16 bits[/url]
online crc калькуляторы разные в i-nete представлены... [url=http://www.sunshine2k.de/coding/javascript/crc/crc_js.html]Тоже большой калькулятор crc[/url] [url=http://www.ghsi.de/pages/subpages/Online%20CRC%20Calculation/]Для Verilog[/url] ... По циклическим кодам - одна из хороших книг [url=http://publ.lib.ru/ARCHIVES/B/BLEYHUT_Richard_E/_Bleyhut_R.E..html]Блейхут Р.Э. Теория и практика кодов, контролирующих ошибки.[/url]
|
|
|
|
Добавлено: Вс авг 19, 2018 12:42 |
|
|
|
|
|
Заголовок сообщения: |
Re: поможите с переводом |
|
|
KPG писал(а): возможен такой вариант соответствует. Online CRC Calculator в зависимости от значения init - либо CRC-16/CCITT-FALSE либо CRC-16/XMODEM
[quote="KPG"] возможен такой вариант :) [/quote] соответствует. [url=http://crccalc.com/]Online CRC Calculator[/url] в зависимости от значения [i]init[/i] - либо CRC-16/CCITT-FALSE либо CRC-16/XMODEM
|
|
|
|
Добавлено: Вс авг 19, 2018 08:31 |
|
|
|
|
|
Заголовок сообщения: |
Re: поможите с переводом |
|
|
По такому коду (найдено в i-net) Код: // Update the CRC for transmitted and received data using // the CCITT 16bit algorithm (X^16 + X^12 + X^5 + 1).
unsigned char ser_data; static unsigned int crc;
crc = (unsigned char)(crc >> 8) | (crc << 8); crc ^= ser_data; crc ^= (unsigned char)(crc & 0xff) >> 4; crc ^= (crc << 8) << 4; crc ^= ((crc & 0xff) << 4) << 1;
составлен Форт код Код: : crc16 ( crc data -- crc' ) SWAP DUP 8 LSHIFT SWAP 8 RSHIFT OR XOR DUP 0xFF AND 4 RSHIFT XOR DUP 12 LSHIFT XOR DUP 0xFF AND 5 LSHIFT XOR 0xFFFF AND ;
P.S. Полином 0x1021
По такому коду (найдено в i-net) [code] // Update the CRC for transmitted and received data using // the CCITT 16bit algorithm (X^16 + X^12 + X^5 + 1).
unsigned char ser_data; static unsigned int crc;
crc = (unsigned char)(crc >> 8) | (crc << 8); crc ^= ser_data; crc ^= (unsigned char)(crc & 0xff) >> 4; crc ^= (crc << 8) << 4; crc ^= ((crc & 0xff) << 4) << 1; [/code]
составлен Форт код [code] : crc16 ( crc data -- crc' ) SWAP DUP 8 LSHIFT SWAP 8 RSHIFT OR XOR DUP 0xFF AND 4 RSHIFT XOR DUP 12 LSHIFT XOR DUP 0xFF AND 5 LSHIFT XOR 0xFFFF AND ; [/code]
P.S. Полином 0x1021
|
|
|
|
Добавлено: Вс авг 19, 2018 08:23 |
|
|
|
|
|
Заголовок сообщения: |
Re: поможите с переводом |
|
|
chu писал(а): кто бы знал По С алгоритму отсюдавозможен такой вариант Код: 0x1021 CONSTANT POLY : crc16 ( crc data -- crc' ) 8 LSHIFT XOR 8 0 DO DUP 0x8000 AND IF 1 LSHIFT POLY XOR ELSE 1 LSHIFT THEN LOOP 0xFFFF AND ;
[quote="chu"]кто бы знал :pilot2;[/quote] [url=http://toddbot.blogspot.com/2012/05/smattering-of-myforth-crc16-checksums.html]По С алгоритму отсюда[/url] возможен такой вариант :) [code] 0x1021 CONSTANT POLY : crc16 ( crc data -- crc' ) 8 LSHIFT XOR 8 0 DO DUP 0x8000 AND IF 1 LSHIFT POLY XOR ELSE 1 LSHIFT THEN LOOP 0xFFFF AND ; [/code]
|
|
|
|
Добавлено: Сб авг 18, 2018 15:07 |
|
|
|
|
|
Заголовок сообщения: |
Re: поможите с переводом |
|
|
упс, наврал. в SPF4(32bit) Код: >S" 123456789" $crc w0x.r 0004 75A3 Ok > так же, как в mecrisp'e
упс, наврал. в SPF4(32bit)[code]>S" 123456789" $crc w0x.r 0004 75A3 Ok >[/code] так же, как в [b]mecrisp[/b]'e
|
|
|
|
Добавлено: Сб авг 18, 2018 13:43 |
|
|
|
|
|
Заголовок сообщения: |
Re: поможите с переводом |
|
|
KPG писал(а): А какое правильное число должно получится на строке 123456789 ? кто бы знал Online CRC Calculator
[quote="KPG"] А какое правильное число должно получится на строке 123456789 ?[/quote] кто бы знал :pilot2; [url=http://crccalc.com/]Online CRC Calculator[/url]
|
|
|
|
Добавлено: Сб авг 18, 2018 13:20 |
|
|
|
|
|
Заголовок сообщения: |
Re: поможите с переводом |
|
|
chu писал(а): KPG писал(а): Может ещё добавить приведение (uint16_t)data $ffff and не помогло А какое правильное число должно получится на строке 123456789 ?
[quote="chu"][quote="KPG"] Может ещё добавить приведение (uint16_t)data $ffff and[/quote] не помогло :|[/quote] А какое правильное число должно получится на строке 123456789 ?
|
|
|
|
Добавлено: Сб авг 18, 2018 13:03 |
|
|
|
|
|
Заголовок сообщения: |
Re: поможите с переводом |
|
|
KPG писал(а): Может ещё добавить приведение (uint16_t)data $ffff and не помогло в SPF4 (32bit) Код: > Ok >S" 123456789" $crc w0x.r 0001 1352 Ok >
[quote="KPG"] Может ещё добавить приведение (uint16_t)data $ffff and[/quote] не помогло :| в SPF4 (32bit) [code]> Ok >S" 123456789" $crc w0x.r 0001 1352 Ok >[/code]
|
|
|
|
Добавлено: Сб авг 18, 2018 12:54 |
|
|
|
|
|
Заголовок сообщения: |
Re: поможите с переводом |
|
|
chu писал(а): напрягает фраза Цитата: Optimized CRC-CCITT calculation. Может ещё добавить приведение (uint16_t)data $ffff and после строк Код: over $ff and xor \ data ^= (crc & 255); dup 4 lshift xor \ data ^= data << 4; для данных т.к. алгоритм для AVR, но вроде это не существенно типы входных параметров uint16_t crc, uint8_t data
[quote="chu"]напрягает фраза [quote]Optimized CRC-CCITT calculation.[/quote][/quote] Может ещё добавить приведение (uint16_t)data $ffff and после строк [code] over $ff and xor \ data ^= (crc & 255); dup 4 lshift xor \ data ^= data << 4;[/code] для данных т.к. алгоритм для AVR, но вроде это не существенно :) типы входных параметров uint16_t crc, uint8_t data
|
|
|
|
Добавлено: Сб авг 18, 2018 12:35 |
|
|
|
|
|
Заголовок сообщения: |
Re: поможите с переводом |
|
|
этих CRC алгоритмов великое множество. Элементарное руководство по CRC алгоритмам обнаружения ошибокно от того не легче напрягает фраза Цитата: Optimized CRC-CCITT calculation.
этих CRC алгоритмов великое множество. [url=http://www.yasmax.net/download/CRC_Guide.pdf]Элементарное руководство по CRC алгоритмам обнаружения ошибок[/url] но от того не легче :( напрягает фраза [quote]Optimized CRC-CCITT calculation.[/quote]
|
|
|
|
Добавлено: Сб авг 18, 2018 12:16 |
|
|
|
|
|
Заголовок сообщения: |
Re: поможите с переводом |
|
|
chu писал(а): беспокоит только наличие единички в старшем полуслове циклического избыточного кода
Здесь после вычисления ещё делается один XOR и для CRC16 в этом алгоритме должно браться $8408 У меня по выше переведённой формуле в SPF4 получается число 0xE0CF8 на тестовой строке, 123456789 а в алгоритме с rosetta при замене константы на $8408 0x906E
[quote="chu"]беспокоит только наличие единички в старшем полуслове циклического избыточного кода [/quote] [url=https://rosettacode.org/wiki/CRC-32#Forth]Здесь после вычисления ещё делается один XOR[/url] и для CRC16 в этом алгоритме должно браться $8408 У меня по выше переведённой формуле в SPF4 получается число 0xE0CF8 на тестовой строке, 123456789 а в алгоритме с rosetta при замене константы на $8408 0x906E :shuffle;
|
|
|
|
Добавлено: Сб авг 18, 2018 11:51 |
|
|
|
|
|
Заголовок сообщения: |
Re: поможите с переводом |
|
|
KPG писал(а): Похоже на правду беспокоит только наличие единички в старшем полуслове циклического избыточного кода Код: ok. $ffff variable seed ok. : crc-ccitt ( crc data -- crc' ) ok. ok. over $ff and xor ok. dup 4 lshift xor ok. dup ok. dup ok. 3 lshift ok. >r ok. $ff and ok. 4 rshift ok. >r ok. 8 lshift ok. swap ok. 8 rshift or ok. r> xor ok. r> xor ok. ; ok. ok. ok. 0 variable 'crc ok. : crc 'crc @ ?dup 0= if cr ." негони" exit then execute ; ok. : $crc ( a # --- crc ) ok. seed @ -rot ok. over + swap ok. do i c@ crc loop ok. ; ok. ok. : tst s" 123456789" ; ok. ok. ' crc-ccitt 'crc ! ok. seed @ w0x.r 0000 FFFF ok. tst $crc w0x.r 0004 75A3 ok.
это допустимо? или гложут меня сомнения. отсюда Циклический избыточный код КАК ПОСЧИТАТЬ КОНТРОЛЬНУЮ СУММУ неочевидно
[quote="KPG"] Похоже на правду :)[/quote] беспокоит только наличие единички в старшем полуслове циклического избыточного кода [code] ok. $ffff variable seed ok. : crc-ccitt ( crc data -- crc' ) ok. ok. over $ff and xor ok. dup 4 lshift xor ok. dup ok. dup ok. 3 lshift ok. >r ok. $ff and ok. 4 rshift ok. >r ok. 8 lshift ok. swap ok. 8 rshift or ok. r> xor ok. r> xor ok. ; ok. ok. ok. 0 variable 'crc ok. : crc 'crc @ ?dup 0= if cr ." негони" exit then execute ; ok. : $crc ( a # --- crc ) ok. seed @ -rot ok. over + swap ok. do i c@ crc loop ok. ; ok. ok. : tst s" 123456789" ; ok. ok. ' crc-ccitt 'crc ! ok. seed @ w0x.r 0000 FFFF ok. tst $crc w0x.r 0004 75A3 ok. [/code] это допустимо? или гложут меня сомнения. отсюда [url=https://ru.wikipedia.org/wiki/%D0%A6%D0%B8%D0%BA%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B8%D0%B7%D0%B1%D1%8B%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4#cite_note-koop04-1]Циклический избыточный код[/url] [url=https://soltau.ru/index.php/themes/dev/item/461-kak-poschitat-kontrolnuyu-summu-crc32-crc16-crc8]КАК ПОСЧИТАТЬ КОНТРОЛЬНУЮ СУММУ[/url] неочевидно
|
|
|
|
Добавлено: Сб авг 18, 2018 08:53 |
|
|
|