簡體   English   中英

漢明碼-錯誤檢測與糾正

[英]Hamming Code - Error Detection & Correction

這個問題以其他一些帖子為基礎。 我知道這是否與Internet上的大多數人無關,但是在這一點上,就像其他任何人一樣,我陷入了困境,無法找到邏輯上的錯誤。 這個問題要求檢查指定的漢明碼是否有單位錯誤,並報告/更正錯誤。 這是這樣做的程序:

#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>

    /** Initializing the global variables */
    int MaxLength;
    int length;
    int parity;
    // Initialize the hamming string with a random or NULL memory address 
    char *HammingString=NULL;

    /** Function to enter the values */
    void EnterParameters(int *length, int *parity)
    {
        printf("Enter the maximum length: ");
        /** %d reads an integer to be stored in an int. This integer can be signed */
        scanf("%d", length);
        printf("Enter the parity (0=even, 1=odd): ");
        /** %d reads an integer to be stored in an int. This integer can be signed */
        scanf("%d", parity);
    }

    void CheckHamming(char *HammingString, int parity)
    { 
        // Initializing the local variables i, j, k, start, length, ParityNumber  
        int i, j, k, start, length, ParityNumber; 
        printf("Enter the Hamming code: ");
        scanf("%s", HammingString);

        int ErrorBit = 0;                        // Initialize the error bit 
        length = strlen(HammingString);          // The strlen computes the length of a string up to, but not including the terminating null character
        length--;
        if (length > MaxLength)
        {
            printf("\n** Invalid Entry - Exceeds Maximum Code Length of %d\n\n", MaxLength);
            return;
        }
        ParityNumber = ceil(log(length)/log(2)); // The ceil function returns the smallest integer that is greater than or equal to 'x'. 

        for(i = 0; i < ParityNumber; i++)
        {
            // pow returns x raised to the power y. In this case, 2 raised to the power i. 
            start = pow(2, i);
            int ParityCheck = parity; 

            for(j = start; j < length; j=j+(2*start))
            {
                for(k = j; (k < ((2*j) - 1)) && (k < length); k++)
                {
                    ParityCheck ^= (HammingString[length - k] - '0');
                } // End the k for-loop 
            } // End the j for-loop

                ErrorBit = ErrorBit + (ParityCheck * start);  
            } // End the i for-loop 

        if(ErrorBit == 0)
        {
            printf("No error \n");
        }
        else
        {
            printf("There is an error in bit: %d\n", ErrorBit);
            if(HammingString[length - ErrorBit] == '0')
            {
                HammingString[length - ErrorBit] = '1';
            } 
            else 
            {
                HammingString[length - ErrorBit] = '0';
            }

            printf("The corrected Hamming code is: %s \n", HammingString);
        } 
    } // End CheckHamming 

    int main()
    {

        int parity; 
        int choice = 0; 
            printf("Error detection/correction: \n");
            printf("----------------------------\n");
            printf("1) Enter parameters \n");
            printf("2) Check Hamming code \n");
            printf("3) Exit \n");
            printf("\nEnter selection: ");
            scanf("%d", &choice);

            while (choice != 3)
            {
                if (choice == 1)
                {
                    EnterParameters(&MaxLength, &parity);
                    HammingString = (char*) malloc (MaxLength * sizeof(char));
                    main();
                }
                else if (choice == 2)
                {
                    CheckHamming(HammingString, parity);
                    main();
                }
                else 
                {
                    printf("Valid options are 1, 2, or 3. Quitting program. \n");
                    exit(0);
                }     
            }//end while
            exit(0);
    }//end main

如果輸入漢明碼:1000110,則手工計算出的錯誤會變成錯誤,但錯誤代碼為6,糾正后的代碼為1100110。此代碼在第3位顯示錯誤,糾正后的代碼為1000010。非常感謝您的幫助。

我不太了解您的代碼應該如何工作。 因此,這是計算代碼1000110的校正子的簡單實現。 程序的輸出為6 ,即錯誤在位6中。

#include <stdio.h>

int main( void )
{               //  7654321
    char input[] = "1000110";
    int parity = 0;
    for ( int mask = 4; mask; mask >>= 1 )
    {
        for ( int bit = 1; bit <= 7; bit++ )
            if ( bit & mask )
                if ( input[7-bit] == '1' )
                    parity ^= mask;
    }
    printf( "%d\n", parity );
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM