Projet Signal

MaxAdLe
Compression

Compresseur propriétaire en Rust avec format d'archive .mal — DEFLATE, CRC32, CLI moderne avec barres de progression temps réel. Archives créées automatiquement dans compressed/, aucune installation requise après téléchargement.

mal — terminal
$ mal compress src/ -l 9
Collecting files...
47 file(s) found

Compressing...
[####################] 12.4MB/12.4MB

Compression successful!
Files : 47
Original : 12.40 MB
Compressed : 4.82 MB (in compressed/)
Savings : 61.1%
Archive : compressed/src.mal

$ mal verify compressed/src.mal
Archive valid. All files intact.
4
Commandes CLI
CRC32
Intégrité
DEFLATE
Algorithme
v1.0
Version

01 — PRÉSENTATION

Histoire
du projet

Origine & contexte

MAL — MaxAdLe — est né dans le cadre de notre école, EPITA, pour laquelle nous devons effectuer un projet en Rust. L'objectif : implémenter un compresseur multi-archive sans perte avec format propriétaire .mal, de zéro, en Rust.

Le projet réunit Maxime Brague-Héroux, Adrien Cornille et Léos Voisin autour d'un défi technique : comprendre LZ77, Huffman et DEFLATE, puis les encapsuler dans une CLI moderne avec progression temps réel.

Pourquoi Rust ?

Sécurité mémoire sans GC, performances proches du C, gestion d'erreurs explicite via anyhow, et un écosystème riche — flate2, clap, indicatif.

Objectifs

Compression multi-fichiers récursive, vérification CRC32 par fichier, niveaux 0–9 ajustables, affichage formaté des archives et CLI colorée avec barres de progression en temps réel.

Organisation automatique

Les archives sont créées automatiquement dans compressed/ sans avoir à spécifier -o. Les fichiers décompressés sont extraits dans decompressed/. En cas de conflit de nom : fichier.malfichier-1.malfichier-2.mal.

Structure du projet

projet/
├── compressed/ <-- Archives créées automatiquement
├── decompressed/ <-- Fichiers extraits automatiquement
├── mal <-- Exécutable
├── compress.sh <-- Script compression
├── decompress.sh <-- Script décompression
└── verify.sh <-- Script vérification
main.rs — structures
// Identifiant magique du format
const MAGIC: &[u8; 4] = b"MAL\0";
const VERSION: u8 = 1;

// En-tête sérialisée en binaire
struct MalHeader {
  magic: [u8; 4],
  version: u8,
  compression_level: u8,
  file_count: u32,
  total_original_size: u64,
  total_compressed_size: u64,
}

// Index par fichier avec CRC32
struct FileEntry {
  path: String,
  original_size: u64,
  compressed_size: u64,
  crc32: u32,
}

Chronologie

Phase 0
Janvier 2026 — Démarrage
Étude des algorithmes (DEFLATE, LZMA, Zstd, Brotli) et définition de l'architecture par Léos. Répartition des missions au sein de l'équipe MaxAdLe.
CdCArchitectureRust
Phase 1
Mars 2026 — Première soutenance
Projet quasiment finalisé. Implémentation du format .mal, intégration de flate2 (DEFLATE) et crc32fast. Commandes compress, decompress, list et verify entièrement opérationnelles.
completCLICRC32flate2
Phase 2
À venir — Deuxième soutenance
Développement d'une interface graphique (GUI) par Maxime pour rendre le compresseur accessible sans terminal. Présentation finale du projet et des benchmarks.
GUIInterfaceMaxime

Problèmes & solutions

🔧

Compatibilité cross-plateforme

Les formats binaires directs peuvent varier selon l'architecture (endianness).

Solution →
Utilisation de serde_json pour l'en-tête et l'index, garantissant un format identique sur Linux, macOS et Windows.
💾

Pics mémoire

Chargement intégral des fichiers avant compression causait des pics RAM sur grosses archives.

Solution →
Modèle streaming avec BufReader / BufWriter, traitement fichier par fichier.
🔍

Vérification d'intégrité

Détecter les corruptions de données accidentelles lors du stockage ou du transfert.

Solution →
Calcul du CRC32 sur les données brutes avant compression, puis vérification systématique après décompression.
📂

Chemins absolus

Chemins sources absolus stockés dans l'archive, rendant la décompression non portable.

Solution →
Normalisation des chemins en relatif lors de la collecte via walkdir pour une extraction propre.

Équilibre Vitesse/Ratio

Choisir l'algorithme offrant le meilleur compromis pour un usage quotidien.

Solution →
Choix de DEFLATE (flate2) : beaucoup plus rapide que LZMA tout en conservant d'excellents taux sur le texte.
🦀

Sécurité Mémoire

Éviter les crashs et les fuites mémoire lors de la manipulation de fichiers binaires.

Solution →
Choix de Rust et de sa gestion d'erreurs explicite (anyhow), garantissant la robustesse du compresseur.

02 — ÉQUIPE

Les trois
développeurs

L
Léos
Voisin · Architecture & Cœur Rust
  • Architecture globale du logiciel
  • Définition du format .mal (Header/Index)
  • Logique de compression/décompression
  • Sérialisation via serde_json
  • Commandes compress, decompress, list, verify
  • Collecte de fichiers (utils.rs)
  • Gestion du CLI avec clap
A
Adrien
Cornille · Site web & Distribution
  • Conception du site web de présentation
  • Développement HTML/CSS (vitrine)
  • Script de packaging (create_package.sh)
  • Automatisation de la distribution
  • Détection OS et architecture
  • Création des archives de déploiement
  • Réalisation des ressources visuelles
M
Maxime
Brague-Héroux · Scripts & Documentation
  • Script de compilation (build.sh)
  • Scripts d'aide (compress, decompress, verify)
  • Rédaction complète du README.md
  • Gestion des arguments shell
  • Messages d'aide et ergonomie scripts
  • Interface graphique (GUI) - À venir
  • Tests utilisateurs et documentation

03 — ALGORITHMES

État de l'art
comparatif

ZIP / DEFLATERetenu

LZ77 + Huffman dynamique. Équilibre optimal vitesse/ratio. Bibliothèque Rust flate2 mature et bien documentée.

Ratio
Vitesse
Simplicité
7-Zip / LZMA

Dictionnaires jusqu'à 4 GB. Excellent ratio mais 10–20× plus lent que DEFLATE. Trop lourd pour notre usage cible.

Ratio
Vitesse
Simplicité
Zstandard

Facebook. Performances extrêmes en décompression. Plus moderne, mais complexité d'implémentation très élevée.

Ratio
Vitesse
Simplicité
Brotli

Google, optimisé pour le web (HTML/CSS). Dictionnaire statique intégré. Peu adapté aux données binaires arbitraires.

Ratio
Vitesse
Simplicité

04 — TÉLÉCHARGEMENTS

Ressources
disponibles

Rapport de Soutenance
Document complet détaillant l'architecture Rust, le format .mal, les choix technologiques et la répartition des missions (Mars 2026).
PDF
↓ Télécharger PDF
Binaire Linux
Binaire précompilé pour Linux x86_64. Aucune installation de Rust requise — extrait et utilise directement. Archives créées dans compressed/.
.tar.gzLinux x86_64
↓ Télécharger le binaire

Utilisation rapide

bash
# Extraire le binaire
$ tar -xvf mal-compressor-1.0.0-linux-x86_64.tar.gz

# Compression — nommage automatique dans compressed/
$ ./compress.sh fichier.txt # → compressed/fichier.mal
$ ./compress.sh dossier/ # → compressed/dossier.mal
$ ./compress.sh file1.txt file2.txt # → compressed/compressedfiles.mal
$ mal compress fichier.txt -l 9 # compression max

# Décompression → decompressed/
$ ./decompress.sh compressed/fichier.mal
$ mal decompress compressed/fichier.mal

# Lister le contenu
$ mal list compressed/fichier.mal

# Vérifier l'intégrité (CRC32)
$ ./verify.sh compressed/fichier.mal
$ mal verify compressed/fichier.mal