C言語の例_パリティチェックアルゴリズム

1. パリティチェックアルゴリズム

パリティ チェック アルゴリズム (Parity Check Algorithm) は、データ送信中にビット エラーが発生したかどうかを確認するために使用される簡単なエラー検出方法です。エラーの検出と訂正は、データに追加のパリティ ビット (チェック ビット) を追加することによって実現されます。

パリティ アルゴリズムでは、各バイトが 8 ビット (ビット) で構成されていると想定されます。パリティ ビットの値は、データ バイト内の 1 の数によって異なります。データ バイト内の 1 の数が偶数の場合、パリティ ビットは 0 に設定され、1 の数が奇数の場合、パリティ ビットは 1 に設定されます。このように、受信側では、受信したデータ バイト内の 1 の数をカウントすることでビット エラーを検出できます。

特定のパリティ チェック アルゴリズムには次の手順が含まれます。

(1) 送信終了: データバイトを送信する前に、データバイト内の 1 の数を数え、その数に応じてパリティビットの値を設定し、データバイトとパリティビットを一緒に送信します。

(2) 受信機: データ バイトを受信した後、受信したデータ バイト内の 1 の数を再度カウントし、受信したパリティ ビットと比較します。両者が一致しない場合は、データ送信時にビットエラーが発生したことになります。

パリティ チェック アルゴリズムは、次のシナリオでよく使用されます。

(1) シリアル通信: シリアル通信では、パリティ チェック アルゴリズムを使用して、データ送信中に発生するビット エラーを検出できます。送信側はパリティビットを計算して送信データバイトに付加し、受信側はパリティビットを検証することで受信データが正しいかどうかを判断します。

(2) ストレージ メディア: ディスク ドライブやフラッシュ メモリなどの一部のストレージ メディアでは、パリティ チェック アルゴリズムを使用して、データの読み取りまたは書き込み中に発生するビット エラーを検出できます。データを保存するときは、パリティ ビットを計算してデータと一緒に保存し、データを読み取るときは、チェック ビットを再度計算し、保存されているチェック ビットと比較して、データの完全性と正確性を保証します。

(3) エラー検出: パリティ チェック アルゴリズムは、単純なエラー検出を必要とする他のシナリオでも使用できます。たとえば、コンピュータのメモリやレジスタでは、パリティ ビットを使用してデータを保存するプロセスでビット エラーを検出し、データの誤用や送信を回避できます。

パリティ チェック アルゴリズムはビット エラーを検出することしかできず、ビット エラーを修正することはできません。エラーが検出された場合は、追加のエラー修正アクションまたはデータの再送信要求が必要になります。

画像-20230626214339103

画像-20230626214412782

2. コードの実装

シナリオ: シングルチップ通信では、シングルチップがホスト コンピュータにデータを送信する必要があります。次のコードは、送信者と受信者によって使用され、パリティ チェック アルゴリズムを使用してデータを検証する 2 つの関数を示しています。

2.1 センダ機能

void sender_send_data_with_parity(unsigned char* data, int length) {
    
    
    // 统计数据字节中1的个数
    int count = 0;
    for (int i = 0; i < length; i++) {
    
    
        unsigned char byte = data[i];
        for (int j = 0; j < 8; j++) {
    
    
            if ((byte >> j) & 1) {
    
    
                count++;
            }
        }
    }

    // 计算奇偶校验位,如果1的个数是偶数,则校验位为0,否则为1
    unsigned char parity_bit = (count % 2 == 0) ? 0 : 1;

    // 发送数据字节和奇偶校验位
    for (int i = 0; i < length; i++) {
    
    
        send_byte(data[i]);
    }
    send_byte(parity_bit);
}

2.2 受信機機能

void receiver_receive_data_with_parity() {
    
    
    // 接收数据
    unsigned char received_data[MAX_LENGTH];
    int length = receive_data(received_data);

    // 统计接收到的数据字节中1的个数
    int count = 0;
    for (int i = 0; i < length - 1; i++) {
    
    
        unsigned char byte = received_data[i];
        for (int j = 0; j < 8; j++) {
    
    
            if ((byte >> j) & 1) {
    
    
                count++;
            }
        }
    }

    // 比较接收到的奇偶校验位与数据字节中1的个数是否一致
    unsigned char expected_parity_bit = (count % 2 == 0) ? 0 : 1;
    unsigned char received_parity_bit = received_data[length - 1];

    if (expected_parity_bit != received_parity_bit) {
    
    
        // 发生了位错误
        handle_error();
    } else {
    
    
        // 数据传输正常
        process_data(received_data, length - 1);
    }
}

おすすめ

転載: blog.csdn.net/xiaolong1126626497/article/details/132269345