CRC codes can only detect error . They cannot correct for any errors in the data once detected at the destination, and the data must be transmitted again to receive the message. (search CRC ARQ in google)
You can use FEC codes for error correction. for eg:
convolutional codes -> serial encoding
reed solomon codes -> block coding
You can combine the CRC with the check sum .
Once the CRC mis-match , reverse shift the correct CRC and bad CRC along with the check sum(minus data). Until they match again in some specific location . Then use the check sum to calculate the error value .
Parity data is good for both error correction and detection when used with CRC. SCSI uses it on mirror systems to decrease the amount of extra drives needed for reconstructing data if a drive fails. It's also extremely easy to implement it's just a matter of xor'ing a series of bytes together. Do not confuse it with the parity bit associated with serial protocols they have nothing to do with each other. A complete explanation can be found here. https://www.pcguide.com/ref/hdd/perf/raid/concepts/genParity-c.html