Mattis Lind wrote: > > > > I have two actual messages from equipment employing IBM BSC: > > > 32016CD90240404070032688 > > > and > > > 32016CD90240C84050030D28 >�> > >
How about this code: #include <stdio.h> int crc16(unsigned char *ptr, int count) { unsigned int crc; char i; crc = 0x0000; while (--count >= 0) { crc = crc ^ (unsigned int) *ptr++; i = 8; do { if (crc & 0x0001) crc = (crc >> 1) ^ 0xA001; /* 0x8005 bit reversed */ else crc = (crc >> 1); } while(--i); } return (crc); } void main() { /* 32 01 6C D9 02 40 40 40 70 03 26 88 */ unsigned char data1[] = {0x6c, 0xd9, 0x02, 0x40, 0x40, 0x40, 0x50, 0x03}; /* 32 01 6C D9 02 40 C8 40 50 03 0D 28 */ unsigned char data2[] = {0x6c, 0xd9, 0x02, 0x40, 0xc8, 0x40, 0x50, 0x03}; printf("crc sent: 8826 computed: %4.4x\n", crc16(data1, sizeof(data1))); printf("crc sent: 280d computed: %4.4x\n", crc16(data2, sizeof(data2))); return; } Please note that I had to cheat to get this to work. It worked initially for the second case but it only worked for the first case when I tweaked 70 to 50, ie I substituted the corresponding value from the second case. Regards, Peter Coghlan.