Add files.h and optimisation of QAM
This commit is contained in:
104
files/files.c
Normal file
104
files/files.c
Normal file
@ -0,0 +1,104 @@
|
||||
#include "files.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
// Lire un fichier binaire et en faire un tableau de bits (0/1)
|
||||
bit_array file_to_bits(const char *filename) {
|
||||
bit_array arr = {0};
|
||||
|
||||
FILE *f = fopen(filename, "rb");
|
||||
if (!f) {
|
||||
perror("fopen");
|
||||
return arr;
|
||||
}
|
||||
|
||||
// Taille fichier
|
||||
fseek(f, 0, SEEK_END);
|
||||
long file_size = ftell(f);
|
||||
rewind(f);
|
||||
|
||||
if (file_size <= 0) {
|
||||
fclose(f);
|
||||
return arr;
|
||||
}
|
||||
|
||||
// Lire tous les octets
|
||||
uint8_t *raw = (uint8_t*)malloc(file_size);
|
||||
if (!raw) {
|
||||
fclose(f);
|
||||
return arr;
|
||||
}
|
||||
fread(raw, 1, file_size, f);
|
||||
fclose(f);
|
||||
|
||||
// Convertir en bits (0/1 dans uint8_t)
|
||||
arr.nb_bits = (size_t)file_size * 8;
|
||||
arr.bits = (uint8_t*)malloc(arr.nb_bits);
|
||||
if (!arr.bits) {
|
||||
free(raw);
|
||||
arr.nb_bits = 0;
|
||||
return arr;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < (size_t)file_size; i++) {
|
||||
for (int b = 0; b < 8; b++) {
|
||||
arr.bits[i * 8 + b] = (raw[i] >> b) & 1u;
|
||||
}
|
||||
}
|
||||
|
||||
free(raw);
|
||||
return arr;
|
||||
}
|
||||
|
||||
// Transformer un tableau de bits (0/1) en fichier binaire
|
||||
int bits_to_file(const char *filename, const bit_array *arr) {
|
||||
if (!arr || !arr->bits) return -1;
|
||||
|
||||
size_t nb_bytes = (arr->nb_bits + 7) / 8;
|
||||
uint8_t *raw = (uint8_t*)calloc(nb_bytes, 1);
|
||||
if (!raw) return -1;
|
||||
|
||||
for (size_t i = 0; i < arr->nb_bits; i++) {
|
||||
if (arr->bits[i]) {
|
||||
raw[i / 8] |= (1u << (i % 8));
|
||||
}
|
||||
}
|
||||
|
||||
FILE *f = fopen(filename, "wb");
|
||||
if (!f) {
|
||||
perror("fopen");
|
||||
free(raw);
|
||||
return -1;
|
||||
}
|
||||
|
||||
fwrite(raw, 1, nb_bytes, f);
|
||||
fclose(f);
|
||||
free(raw);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Génère un nom du type "output.<ext>" où <ext> est l'extension du fichier d'entrée
|
||||
char* make_output_filename(const char *input_filename) {
|
||||
const char *dot = strrchr(input_filename, '.');
|
||||
const char *ext = dot ? dot + 1 : "bin";
|
||||
|
||||
// Construire "output.<ext>"
|
||||
size_t len = strlen(ext) + strlen("output.") + 1;
|
||||
char *out = (char*)malloc(len);
|
||||
if (!out) return NULL;
|
||||
|
||||
snprintf(out, len, "output.%s", ext);
|
||||
return out;
|
||||
}
|
||||
|
||||
|
||||
// Libérer la mémoire
|
||||
void free_bit_array(bit_array *arr) {
|
||||
if (arr && arr->bits) {
|
||||
free(arr->bits);
|
||||
arr->bits = NULL;
|
||||
arr->nb_bits = 0;
|
||||
}
|
||||
}
|
||||
|
||||
21
files/files.h
Normal file
21
files/files.h
Normal file
@ -0,0 +1,21 @@
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
// Conteneur de bits (0/1 stockés dans uint8_t)
|
||||
typedef struct {
|
||||
uint8_t *bits; // tableau de 0/1
|
||||
size_t nb_bits; // nombre total de bits
|
||||
} bit_array;
|
||||
|
||||
// Lire un fichier binaire et le transformer en tableau de bits (0/1)
|
||||
bit_array file_to_bits(const char *filename);
|
||||
|
||||
// Transformer un tableau de bits (0/1) en fichier binaire
|
||||
int bits_to_file(const char *filename, const bit_array *arr);
|
||||
|
||||
// Génère un nom du type "output.<ext>" où <ext> est l'extension du fichier d'entrée
|
||||
char* make_output_filename(const char *input_filename);
|
||||
|
||||
// Libérer la mémoire du bit_array
|
||||
void free_bit_array(bit_array *arr);
|
||||
Reference in New Issue
Block a user