need help with converting c function to python function

John Machin sjmachin at lexicon.net
Thu Jul 5 17:58:30 EDT 2007


On Jul 6, 3:32 am, nephish <neph... at gmail.com> wrote:
> hello all,
>
> i have a c function from some modbus documentation that i need to
> translate into python.
>
> it looks like this:
>
> unsigned short CRC16(puchMsg, usDataLen)
> unsigned char *puchMsg ;
> unsigned short usDataLen ;
> {
>    unsigned char uchCRCHi = 0xFF ;
>    unsigned char uchCRCLo = 0xFF ;
>    unsigned uIndex ;
>    while (usDataLen--)
>        {
>        uIndex = uchCRCHi ^ *puchMsgg++ ;
>        uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex} ;
>        uchCRCLo = auchCRCLo[uIndex] ;
>        }
>    return (uchCRCHi << 8 | uchCRCLo) ;
>
> }
>
> some of it i can make out, but i can't seem to figgure out
> this part ' auchCRCHi[uIndex};
> it looks like a typo, because there is a closing } that does not match
> the opening [.

Yes, that's one problem.
The other problems are:

(1) you haven't noticed that auchCRClo is *NOT* the same as uchCRClo
(ditto "hi").

(2) the C code is missing global declarations, something like this:

unsigned char auchCRCLo[256] = { yadda yadda yadda}; /* ditto "hi" */

These two tables of 8-bit constants correspond to the single "table"
of 16-bit constants in the reference that Anton gave you.

Aside: the code looks like it was originally Z80 assembly language
subsequently transliterated into BDS C (of blessed memory).


(3) you have misread/mistranslated auchCRCLo[uIndex] blindly and
unconcernedly as uchCRCLo ^ uIndex !!! (ditto "hi")

>
> here is what i have so far, but is not giving me the right values
>
>  def crc16(data):
>      crc_hi = 0xff
>      crc_lo = 0xff
>      for x in data:
>          crc_index = crc_hi ^ x
>          crc_hi = crc_lo ^ (crc_hi | crc_index)
>          crc_lo = crc_lo | crc_index
>      return (crc_hi << 8 | crc_lo)
>
> whaddya think?

I don't think you really want to know :-)





More information about the Python-list mailing list