2010-04-29 79 views
0

如何申请checkksum为char在C?申请校验为char

+2

校验和用于区分两个大型数据体而不进行比较。 char是C中的最小数据量。因此,标识函数是您可以做的最好的数据。 – Potatoswatter 2010-04-29 06:39:38

+0

我明白了,但是如果我觉得如此倾向于做项目需求,它将如何完成? – HelpPlease 2010-04-29 06:42:00

+2

你的意思是(char)在单个字节中吗?或者你的意思是一个数组或字符串文字?这闻起来像功课,这是一个任务? – 2010-04-29 06:42:15

回答

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,检查该位为上,则相应的位值(即,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); 
}