#include #include #include typedef struct bmp_header bmp_header; struct bmp_header { uint8_t id[2]; uint8_t size[4]; uint8_t r1[2]; uint8_t r2[2]; uint8_t offset[4]; }; int32_t little_endian(uint8_t bytes[4]) { int32_t le = bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24); return le; } int main(int argc, char **argv) { if (argc != 2) { fprintf(stderr, "extractor [usage]: input_file"); return EXIT_FAILURE; } bmp_header header; char search; int count = 0; char out_name[128] = {0}; char *in = argv[1]; FILE *fin = fopen(in, "r"); fseek(fin, 0, SEEK_SET); while (fread(&search, sizeof(char), 1, fin) > 0) { if (search != 'B') continue; if (fread(&search, sizeof(char), 1, fin) <= 0) continue; if (search != 'M') continue; fpos_t pos; fseek(fin, -2 * sizeof(char), SEEK_CUR); fgetpos(fin, &pos); fread(&header, sizeof(bmp_header), 1, fin); if (header.r1[0] == 0 && header.r1[1] == 0 && header.r2[0] == 0 && header.r2[1] == 0) { fseek(fin, pos, SEEK_SET); int32_t size = little_endian(header.size); char *data = (char *)malloc((size + 1) * sizeof(char)); fread(data, sizeof(char), size, fin); data[size + 1] = 0; snprintf(out_name, sizeof out_name, "%s_%d.bmp", in, ++count); FILE *fout = fopen(out_name, "w"); fwrite(data, sizeof(char), size, fout); fclose(fout); free(data); } } fclose(fin); return EXIT_SUCCESS; }