Алгоритм crc16 от C ++ до bash

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

Я не совсем понимаю, почему контрольные суммы кода C ++ и сценария bash различаются.

Другая пара глаз была бы большим подспорьем.

Вот код C ++:

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;
}

А вот мой код на bash:

function calc_crc16()
{
    string=$1
    while read -d "" -n 1 ; do astring+=( "$reply" ) ; done <<< "$string"

    cnt=${#astring[@]}
    c=0xffff

    for ((x=0;x<$cnt;x++)); do
        char=${astring[$x]}
        e=$(($c ^ $char))
        s=$(($e << 4))
        f=$(($e ^ $s))
        t1=$(($c >> 8))
        t2=$(($f << 8))
        t3=$(($f << 3))
        t4=$(($f >> 4))
        r1=$(($t1 ^ $t2 ^ $t3 ^ $t4))
        c=$r1
    done
    c=$c ^ 0xffff
    echo "checksum = $c"
}

Это как-то связано с размером целых чисел? Полагаю, в bash я мало что могу с этим поделать.

Я получаю реальное число, но оно не соответствует C ++, который, как я знаю, работает правильно. Кто-нибудь видит что-нибудь, где я могу лажать?

0
задан Lion 19 December 2011 в 16:51
поделиться