On Jul 6, 3:32 am, nephish <[EMAIL PROTECTED]> 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 :-) -- http://mail.python.org/mailman/listinfo/python-list