Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пн окт 14, 2019 21:50

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - поможите с переводом
Автор Сообщение
  Заголовок сообщения:  Re: поможите с переводом  Ответить с цитатой
на всякий случай, чтоб не потерялась
Сообщение Добавлено: Сб май 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.

зы.
хорошо потрудились. спасибо.
желаю каждому фортеру взаимопонимания и сотрудничества с другими братьями по разуму :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  ;
Сообщение Добавлено: Пн авг 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 bits

online crc калькуляторы разные в i-nete представлены...
Тоже большой калькулятор crc
Для Verilog
...
По циклическим кодам - одна из хороших книг Блейхут Р.Э. Теория и практика кодов, контролирующих ошибки.
Сообщение Добавлено: Вс авг 19, 2018 12:42
  Заголовок сообщения:  Re: поможите с переводом  Ответить с цитатой
KPG писал(а):
возможен такой вариант :)

соответствует. Online CRC Calculator
в зависимости от значения init -
либо 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
Сообщение Добавлено: Вс авг 19, 2018 08:23
  Заголовок сообщения:  Re: поможите с переводом  Ответить с цитатой
chu писал(а):
кто бы знал :pilot2;

По С алгоритму отсюда
возможен такой вариант :)
Код:
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
;
Сообщение Добавлено: Сб авг 18, 2018 15:07
  Заголовок сообщения:  Re: поможите с переводом  Ответить с цитатой
упс, наврал. в SPF4(32bit)
Код:
>S" 123456789" $crc w0x.r
0004 75A3 Ok
>

так же, как в mecrisp'e
Сообщение Добавлено: Сб авг 18, 2018 13:43
  Заголовок сообщения:  Re: поможите с переводом  Ответить с цитатой
KPG писал(а):
А какое правильное число должно получится на строке 123456789 ?

кто бы знал :pilot2;
Online CRC Calculator
Сообщение Добавлено: Сб авг 18, 2018 13:20
  Заголовок сообщения:  Re: поможите с переводом  Ответить с цитатой
chu писал(а):
KPG писал(а):
Может ещё добавить приведение (uint16_t)data
$ffff and

не помогло :|

А какое правильное число должно получится на строке 123456789 ?
Сообщение Добавлено: Сб авг 18, 2018 13:03
  Заголовок сообщения:  Re: поможите с переводом  Ответить с цитатой
KPG писал(а):
Может ещё добавить приведение (uint16_t)data
$ffff and

не помогло :|
в SPF4 (32bit)
Код:
>
Ok
>S" 123456789" $crc w0x.r
0001 1352 Ok
>
Сообщение Добавлено: Сб авг 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
Сообщение Добавлено: Сб авг 18, 2018 12:35
  Заголовок сообщения:  Re: поможите с переводом  Ответить с цитатой
этих CRC алгоритмов великое множество.
Элементарное руководство по CRC алгоритмам обнаружения ошибок
но от того не легче :(
напрягает фраза
Цитата:
Optimized CRC-CCITT calculation.
Сообщение Добавлено: Сб авг 18, 2018 12:16
  Заголовок сообщения:  Re: поможите с переводом  Ответить с цитатой
chu писал(а):
беспокоит только наличие единички в старшем полуслове циклического избыточного кода

Здесь после вычисления ещё делается один XOR и для 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.

это допустимо? или гложут меня сомнения.
отсюда Циклический избыточный код
КАК ПОСЧИТАТЬ КОНТРОЛЬНУЮ СУММУ неочевидно
Сообщение Добавлено: Сб авг 18, 2018 08:53

Часовой пояс: UTC + 3 часа [ Летнее время ]


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB