[Tutor] CRC calculation with python

Daniel Yoo dyoo at WPI.EDU
Tue Feb 6 17:25:22 CET 2007



On Tue, 6 Feb 2007, Johan Geldenhuys wrote:

> I'm not a C++ expert at all and I would like to find out if somebody can 
> explain to me how the statement below can be done in Python?
>
> """
> _uint16 ComCRC16(_uint8 val, _uint16 crc)
> {
>        _uint8 i;
>        _uint16 cval;
>
>    for (i=0;i<8;i++)
>    {
>        if (((crc & 0x0001)^(val & 0x0001))!= 0)   crc = (crc >> 1)^
> CCITT_POLY;
>        else   crc >>= 1;
>        val >>= 1;
>    }
>    return crc
> }
>
> """

I agree with Kent that you might want to see if someone has done this work 
already.  Still, a translation of the above should be fairly 
straightforward.  We do have right shifts, and bitwise operators:

############
>>> (42 >> 1)
21
############

The bit pattern of 42 is shifted to the right by one place: in effect, 
doing a division by 2.


We also have XORs and bitwise ANDs:

############
>>> (12345678 ^ 0xdeadbeef)
<stdin>:1: FutureWarning: hex/oct constants > sys.maxint will return 
positive values in Python 2.4 and up
-569253983
>>>
>>> (12345678 ^ 0xdeadbeef) ^ 0xdeadbeef
<stdin>:1: FutureWarning: hex/oct constants > sys.maxint will return 
positive values in Python 2.4 and up
12345678
############


What problems do you have in translating the C++ code to the equivalent 
Python code?


More information about the Tutor mailing list