#include // Function to perform CRC decoding int* decodeCRC(int receivedData[], int receivedDataSize, int generator[], int generatorSize) { int dataSize = receivedDataSize - generatorSize + 1; int* remainder = new int[generatorSize - 1](); for (int i = 0; i < dataSize; i++) { if (remainder[0] == 1) { for (int j = 1; j < generatorSize; j++) { remainder[j - 1] = (remainder[j - 1] + generator[j]) % 2; } } for (int j = 0; j < generatorSize - 1; j++) { remainder[j] = (remainder[j] + receivedData[i + j]) % 2; } } // Check if remainder is all zeros for (int i = 0; i < generatorSize - 1; i++) { if (remainder[i] != 0) { std::cout << "Error detected in received data!" << std::endl; delete[] remainder; return nullptr; } } // Remove the CRC remainder from received data int* decodedData = new int[dataSize]; for (int i = 0; i < dataSize; i++) { decodedData[i] = receivedData[i]; } delete[] remainder; return decodedData; } int main() { // Get received data from user int receivedData[100]; // Assuming a maximum of 100 elements int dataInput, receivedDataSize = 0; std::cout << "Enter received data (0 or 1, separated by spaces, end with -1): "; while (std::cin >> dataInput && dataInput != -1) { receivedData[receivedDataSize++] = dataInput; } // Get generator polynomial from user int generator[100]; // Assuming a maximum of 100 elements int generatorSize = 0; std::cout << "Enter generator polynomial coefficients (0 or 1, separated by spaces, end with -1): "; while (std::cin >> dataInput && dataInput != -1) { generator[generatorSize++] = dataInput; } // Decode the received data int* decodedData = decodeCRC(receivedData, receivedDataSize, generator, generatorSize); // Output the decoded data if (decodedData != nullptr) { std::cout << "Decoded Data: "; for (int i = 0; i < receivedDataSize - generatorSize + 1; i++) { std::cout << decodedData[i] << " "; } std::cout << std::endl; delete[] decodedData; } return 0; }