#include <stdio.h>
#include <string.h>
#define DEBUG
#define FILE_OUT stdout
#define SIZE_IN 3
#define SIZE_OUT 4
void fprintbits(FILE *fp, char c) {
int i, mask;
for(i=7; i>=0; i--)
fputc((c & (1 << i)) == 0 ? '0' : '1', fp);
}
int main(int argc, char **argv) {
FILE *fp;
int filesize, i;
char buffer_in[SIZE_IN];
char buffer_out[SIZE_OUT];
// Abre o arquivo
fp = fopen("origem.txt", "r");
if (ferror(fp)) {
perror("erro ao abrir arquivo\n");
return 2;
}
// Verifica o tamanho do arquivo
fseek(fp, 0, SEEK_END);
filesize = ftell(fp) - 1;
if (filesize % SIZE_IN) {
fprintf(stderr, "tamanho de arquivo invalido\n");
return 2;
}
rewind(fp);
// Loop de leitura do arquivo
while (1) {
// Le N bytes
if (fread(buffer_in, 1, SIZE_IN, fp) != SIZE_IN)
break;
// Processa os dados
// (111100|00) (1010|1010) (00|001111)
buffer_out[0] = buffer_in[0] >> 2;
buffer_out[1] = (buffer_in[0] & 0x3) << 4 | buffer_in[1] >> 4;
buffer_out[2] = (buffer_in[1] & 0xF) << 2 | (buffer_in[2] & 0xC0) >> 6;
buffer_out[3] = buffer_in[2] & 0x3F;
#if DEBUG
// Mostra os dados na tela
fprintf(FILE_OUT, "IN:\n");
for (i=0; i<SIZE_IN; i++) {
fprintbits(FILE_OUT, buffer_in[i]);
fprintf(FILE_OUT, "\n");
}
fprintf(FILE_OUT, "OUT:\n");
for (i=0; i<SIZE_OUT; i++) {
fprintbits(FILE_OUT, buffer_out[i]);
fprintf(FILE_OUT, "\n");
}
#endif
// E aqui voce processa os bytes de buffer_out…
}
// Fecha o arquivo
fclose(fp);
return 0;
}