CRC16 алгоритм от CPP до Bash? - PullRequest
       22

CRC16 алгоритм от CPP до Bash?

0 голосов
/ 15 декабря 2011

мы отправляем некоторые данные по последовательной линии, и я могу делать почти все с помощью сценария bash (вместо кода), за исключением вычисления crc16.если бы я мог делать все это в сценариях, а не в коде, это сделало бы настройку более легкой (особенно в полевых условиях).прочее.

поэтому мой вопрос, может ли кто-нибудь сделать для меня переписать этот CRC16, но в bash?

вот алгоритм, взятый из википедии, и он есть в нашем коде:

uint16_t Encoder::checksum(std::string thestring)
{
    uint8_t d, e, f;
    uint16_t c, r, crccalc;
    c = 0xffff;

    for (unsigned int i = 0; i < thestring.length(); i++)
    {
        d = thestring[i];
        e = c ^ d;
        f = e ^ (e << 4);
        r = (c >> 8) ^ (f << 8) ^ (f << 3) ^ (f >> 4);
        c = r;
    }
    c ^= 0xffff;
    crccalc = c;
    return crccalc;
}

я могу легко создать исполняемый файл из кода C ++ и просто передать его в стандартный вводно я думаю, было бы очень полезно иметь это в bash.

другая вещь, которую я не знаю, это как убедиться, что мои переменные размеры верны.Как я могу убедиться, что я получаю 16-битное целое число?

любая помощь будет отличной.Я нашел маленький сценарий онлайн, но я не доверял ему.Я подумал, что было бы здорово ответить здесь.

1 Ответ

0 голосов
/ 15 декабря 2011

Bash имеет:

  • xor ($((5^2)) будет 7);
  • левое смещение ($(3<<2) будет 12);
  • правое смещение($(8>>2) будет 2);
  • поддержка шестнадцатеричных чисел ($((0xFF)) будет 255).

Ничего не приходит в голову для преобразования из 32 (64) в 16 битцелое число в чистом Bash, но вы можете сделать это с помощью awk:

$ echo 65536 | awk '{printf("%hu\n",$1)}'
0

Этого должно быть достаточно, чтобы переписать алгоритм в Bash.

...