簡體   English   中英

將c中的校驗和應用於char

[英]apply checksum in c to a char

您如何將Checkksum應用於c中的char?

校驗和將位的序列減少為較短的序列,以使對較大序列的更改導致對較短校驗和的隨機更改。

字符已經很小。 要產生校驗和,您將需要一個位域。 實際上,您將需要兩個,因為僅一個位域至少會被填充為一個完整的字節。

struct twochars_checksum {
    unsigned sum_a : CHAR_BIT / 2;
    unsigned sum_b : CHAR_BIT / 2;
};

void sum_char( char c, struct twochars_checksum *dest, int which ) {
    int sum;
    sum = c ^ c >> CHAR_BIT / 2; // suboptimal, but passable
    if ( which == 0 ) {
        dest->sum_a = sum;
    } else {
        dest->sum_b = sum;
    }
}

建議采用類似的方法來傳輸帶有校驗和的數據字節。

計算校驗和的算法非常簡單,如下所示。

1.檢查該位是否開啟,然后將相應的位值(即位位置的冪2)加到校驗和。

2.如果該位為off,則用1來檢測和。

注意:您可以通過更改函數calculate_checksum()使用自己的校驗和算法。
您可以在set_transfer_data()中包含自己的處理邏輯。

#include <stdio.h>
typedef unsigned char   uint8_t;
typedef unsigned short  uint16_t;
typedef unsigned int    uint32_t;
#define NUM_BITS        (8)


uint16_t calculate_checksum(const uint8_t data)
{
    uint16_t checksum = 0;
    uint8_t  bit_index = 0;
    uint8_t  bit_value = 0;
    while( bit_index < NUM_BITS )   
    {
        bit_value = 1 << bit_index++;
        checksum += ( data & bit_value ) ? bit_value : -1;
    }
    return ( checksum );
}

uint8_t set_transfer_data( uint32_t *dest_data , const uint8_t src_data , const uint16_t checksum )
{
    uint8_t return_value = 0;
    *dest_data = checksum << NUM_BITS | src_data ;
    return ( return_value );
}

int main()
{
        uint8_t         return_value = 0;
        uint8_t         source_data = 0xF3;
        uint32_t        transfer_data = 0;
        uint16_t        checksum = 0;

        checksum = calculate_checksum( source_data );

        printf( "\nChecksum calculated = %x",checksum );

        return_value = set_transfer_data( &transfer_data,source_data,checksum );

        if( 0 == return_value )
        {
            printf( "\nChecksum added successfully; transfer_data = %x",
                    transfer_data );
        }
        else
        {
            printf( "\nError adding checksum" );
        }
        return ( 0 );
}

暫無
暫無

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

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