IBM BSC CRC?

Peter Coghlan cctalk at beyondthepale.ie
Mon Jan 27 11:13:23 CST 2020


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.


More information about the cctalk mailing list