如何将checkksum应用于c中的char?
答案 0 :(得分:3)
校验和会将比特序列缩减为较短的序列,这样对较大序列的更改会导致随机更改为较短的校验和。
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 :(得分:1)
建议采用类似的方法来传输带校验和的数据字节。
计算校验和的算法非常简单,如下所示。
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 );
}