add wav, bitmap, and generic extractor
This commit is contained in:
		
							parent
							
								
									2ea866483e
								
							
						
					
					
						commit
						cef46fa34d
					
				|  | @ -0,0 +1,60 @@ | |||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| 
 | ||||
| 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; | ||||
| } | ||||
|  | @ -0,0 +1,28 @@ | |||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| 
 | ||||
| int | ||||
| main(int argc, char** argv) | ||||
| { | ||||
| 	if (argc != 5) | ||||
| 	{ | ||||
| 		fprintf(stderr, "extractor [usage]: input_file output_file size offset"); | ||||
| 		return EXIT_FAILURE; | ||||
| 	} | ||||
| 
 | ||||
| 	char* in = argv[1]; | ||||
| 	char* out = argv[2]; | ||||
| 	int size = atoi(argv[3]); | ||||
| 	int offset = atoi(argv[4]); | ||||
| 	char* data = (char*)malloc(size + 1 * sizeof(char)); | ||||
| 	FILE* fin = fopen(in, "r"); | ||||
| 	fseek(fin, offset, SEEK_SET); | ||||
| 	fread(data, sizeof(char), size, fin); | ||||
| 	data[size + 1] = 0; | ||||
| 	fclose(fin); | ||||
| 	FILE* fout = fopen(out, "w"); | ||||
| 	fwrite(data, sizeof(char), size, fout); | ||||
| 	fclose(fout); | ||||
| 	free(data); | ||||
| 	return EXIT_SUCCESS; | ||||
| } | ||||
|  | @ -0,0 +1,81 @@ | |||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| 
 | ||||
| typedef struct wav_header wav_header; | ||||
| struct wav_header { | ||||
|   uint8_t id[4]; | ||||
|   uint8_t size[4]; | ||||
|   char wave[4]; | ||||
|   char fmt[4]; | ||||
|   uint8_t fmt_data_len[4]; | ||||
|   uint8_t type[2]; | ||||
|   uint8_t channels[2]; | ||||
|   uint8_t sample_rate[4]; | ||||
|   uint8_t total_rate[4]; | ||||
|   uint8_t audio_type[2]; | ||||
|   uint8_t bbs[2]; | ||||
|   char data_str[4]; | ||||
|   uint8_t data_size[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; | ||||
|   } | ||||
|   wav_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 != 'R') | ||||
|       continue; | ||||
| 
 | ||||
|     if (fread(&search, sizeof(char), 1, fin) <= 0) | ||||
|       continue; | ||||
| 
 | ||||
|     if (search != 'I') | ||||
|       continue; | ||||
| 
 | ||||
|     if (fread(&search, sizeof(char), 1, fin) <= 0) | ||||
|       continue; | ||||
| 
 | ||||
|     if (search != 'F') | ||||
|       continue; | ||||
| 
 | ||||
|     if (fread(&search, sizeof(char), 1, fin) <= 0) | ||||
|       continue; | ||||
| 
 | ||||
|     if (search != 'F') | ||||
|       continue; | ||||
| 
 | ||||
|     fpos_t pos; | ||||
|     fseek(fin, -4 * sizeof(char), SEEK_CUR); | ||||
|     fgetpos(fin, &pos); | ||||
|     fread(&header, sizeof(wav_header), 1, fin); | ||||
| 	 | ||||
|     fseek(fin, pos, SEEK_SET); | ||||
|     int32_t size = little_endian(header.data_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.wav", in, ++count); | ||||
|     FILE *fout = fopen(out_name, "w"); | ||||
|     fwrite(data, sizeof(char), size, fout); | ||||
|     fclose(fout); | ||||
|     free(data); | ||||
|   } | ||||
| 
 | ||||
|   fclose(fin); | ||||
|   return EXIT_SUCCESS; | ||||
| } | ||||
		Loading…
	
		Reference in New Issue