2012-04-14 3 views
3

C에서 바이너리 파일의 내용을 읽고 체크섬의 유효성을 검사하는 올바른 방법은 무엇입니까? 여기 C - 바이너리 파일 읽기, 체크섬 확인

내가 작업있어 데이터의 예이다 (괄호 사이)

 
0A 01 17 D8 04 00 07 9A 1F 10 FF CF 7F FF FF FF 
FF 7F 7F 7F FF 7F FF FF FF FF 7F 81 01 01 03 01 
01 01 01 81 00 73 67 68 66 97 6C 76 64 64 6A 6B 
6E 64 66 67 44 41 [17 7A]

 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 44 41 [00 85]

체크섬 2로 이전 54 바이트의 합계를 기억 -byte (빅 엔디안) 번호.

#include <stdio.h> 
int main(int argc, char **argv) 
{ 
    FILE *f = fopen(argv[1], "rb"); 

    unsigned char data[512]; 
    fread(data, 1, 512, f); 

    int i; 
    int sum = 0; 
    for (i = 0; i < 54; i++) 
    { 
     sum += data[i]; 
    } 

    if ((sum >> 8) == data[54] && 
     (sum & 0xFF) == data[55]) 
    { 
     printf("Checksum is valid.\n"); 
    } 
    else 
    { 
     printf("Checksum is invalid.\n"); 
    } 
    system("pause"); 
} 

내가 바이트를 저장하는 char 배열을 사용하고, 루프의 체크섬을 계산하기 위해 인덱스를 사용하여 :

이 내가 사용했던 것입니다. 유효성을 검사하기 위해 비트 시프 팅과 마스킹을 사용했습니다. 더 나은 해결책이 있습니까?

감사합니다.

답변

3

작성한 내용은 합리적입니다. 그러나 56 바이트 만 있으면 512 바이트를 읽는 데 실제적인 포인트가 없습니다. 또한 512를 반복하는 대신 두 번째 모양으로 sizeof(data)을 사용하십시오. 코드를 함수로 패키징 할 수 있으며, 불일치가있을 경우 실제 체크섬과 예상 체크섬을 인쇄 할 수 있습니다. 체크섬 알고리즘은 매우 민감하지 않으므로, 정답 수를 잡을지라도, 조바꿈 오류와 같은 실수를 쉽게 놓치게됩니다.


흠 ... 다시 찾고 ... 당신은 서면으로 작성했습니다 : sum 이후

if ((sum >> 8) == data[54] && 
    (sum & 0xFF) == data[55]) 

이 (서명) int, 당신은 아마 작성해야입니다 :

if ((sum >> 8) & 0xFF == data[54] && 
    (sum & 0xFF)  == data[55]) 

그렇지 않으면 오버플로가 발생할 수 있습니다. 데이터의 54 바이트만으로는 충분하지 않을 수도 있지만, 체크섬 될 데이터가 충분히 길면 (256 바이트 이상) 합계가 65535 이상이 될 수 있으며 그렇지 않을 경우 비교가 실패합니다. 나는 sizeof(int) == 4이고, 아니라는 것은 sizeof(int) == 2이라고 가정합니다.