2010-04-29 7 views
0

c로 chars에 checkksum을 어떻게 적용합니까?체크섬을 C에서 char로 적용

+2

체크섬은 두 개의 큰 본문을 비교하지 않고 구분하는 데 사용됩니다. char는 C에있는 데이터 중 가장 작은 양입니다. 따라서 식별 함수가 가장 좋습니다. – Potatoswatter

+0

제가 볼 수는 있지만 그렇게 생각한다면 프로젝트 요구 사항을 어떻게 수행할까요? – HelpPlease

+2

1 바이트와 같이 (char)를 의미합니까? 또는 배열 또는 문자열 리터럴을 의미합니까? 숙제 냄새가 나는데 숙제 때문에 그런가요? –

답변

3

체크섬은 비트 시퀀스를 더 짧은 시퀀스로 줄이므로 더 큰 시퀀스로 변경하면 더 짧은 체크섬이 무작위로 변경됩니다.

숯은 이미 아주 작습니다. 체크섬을 생성하려면 비트 필드가 필요합니다. 사실, 하나의 비트 필드만으로는 최소한 전체 바이트가 패딩되므로 두 개가 필요합니다.

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.If 비트 오프 후 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); 
} 
관련 문제