/* * *** Listing 1-5 *** * * Programme pour calculer la somme (checksum) sur 16 bits d'un flux d'octets * depuis le fichier spécifié. Effectue en interne le tamponnage, à la place * d'une fonction C ou DOS. */ #include #include #include /* alloc.h pour Compilateur Borland, malloc.h pour Compilateur Microsoft */ #define BUFFER_SIZE 0x8000 /* Tampon de données de 32K */ main(int argc, char *argv[]) { int Handle; unsigned int Checksum; unsigned char *WorkingBuffer, *WorkingPtr; int WorkingLength, LengthCount; if ( argc != 2 ) { printf("syntaxe : nom_du_fichier \n"); exit(1); } if ( (Handle = open(argv[1], O_RDONLY | O_BINARY)) == -1 ) { printf("Impossible d'ouvrir le fichier: %s\n", argv[1]); exit(1); } /* Alloue de la mémoire pour chaque tampon de données */ if ( (WorkingBuffer = malloc(BUFFER_SIZE)) == NULL ) { printf("Impossible d'allouer la mémoire \n"); exit(1); } /* Initialise la somme */ Checksum = 0; /* Traitement par blocs de taille BUFFER_SIZE */ do { if ( (WorkingLength = read(Handle, WorkingBuffer, BUFFER_SIZE)) == -1 ) { printf("Erreur en lecture du fichier %s\n", argv[1]); exit(1); } /* Calcul de la somme de ce bloc */ WorkingPtr = WorkingBuffer; LengthCount = WorkingLength; while ( LengthCount-- ) { /* Additionne chaque octet à la somme */ Checksum += (unsigned int) *WorkingPtr++; } } while ( WorkingLength ); /* Reporte le résultat */ printf("La somme est: %u\n", Checksum); exit(0); }