Code:
uint16_t crc_xmodem_update (uint16_t crc, int8_t daten){
	crc = crc ^ ((uint16_t)daten << 8);
	for (int i=0; i<8; i++)
	{
		if (crc & 0x8000)
			crc = (crc << 1) ^ 0x1021;
		else
			crc <<= 1;
	}
	return crc;
}
0x1021 ist das polynom theoretisch müsstest du für deinen fall nur dein polynom anpassen
0xc003 wäre X16+X15+X2+1 bzw. 1100000000000011
für den exponenten einfach das entsprechende bit. in dem 16bit hexwert setzen. das müsste man automatisieren können. über die eingabe der hexzahl könntest du dann halt das zu grunde liegende polynom ändern.