применить контрольную сумму в c для символа - PullRequest
0 голосов
/ 29 апреля 2010

Как применить checkksum к символу в c?

Ответы [ 2 ]

3 голосов
/ 29 апреля 2010

Контрольная сумма уменьшает последовательность битов до более короткой последовательности, так что изменение более длинной последовательности приводит к случайному изменению более короткой контрольной суммы.

Символ уже совсем маленький. Для получения контрольной суммы вам понадобится битовое поле. На самом деле вам понадобятся два, поскольку одно только битовое поле будет дополнено по крайней мере до полного байта.

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 голос
/ 29 апреля 2010

Предложите следовать аналогичному подходу для передачи байта данных с контрольной суммой.

Алгоритм вычисления контрольной суммы довольно прост и выглядит следующим образом.

1. Проверьте, включен ли бит, затем добавьте к контрольной сумме соответствующее значение бита (т. Е. 2 ​​к степени битовой позиции).

2. Если бит выключен, определить сумму на 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 );
}
...