Bonjour à tous,
Avant tout, je tiens à vous avertir que je n'utilise pas le langage Perl, mon domaine, c'est plutôt le PHP, Java, WinDev et C#.
Voici ma situation, je recherchait sur le Web un moyen d'extraire d'un fichier structuré précis les petits fichiers imbriqués qu'il contient, une sorte d'archive non compressée en quelque sorte. Je ne connais pas la position exacte de ces petits fichiers donc je n'ai pas pu les extraire moi-même.
En cherchant longtemps, j'ai trouvé la solution sur un site anglais sous la forme d'un script Perl, parsant un fichier texte (contenant les offsets des différents petits fichiers, le gars avait fait une autre manipulation pour les obtenir) pour envoyer ses infos à un exécutable en ligne de commande qui se charge ensuite de découper l'archive comme il faut.
Malheureusement, ce petit exécutable (sûrement très vieux) ne fonctionne pas sur toutes les machines que j'ai testé. Et je ne ne connais aucun autre programme en ligne de commande pour le remplaçer.Pour contourner le problème, j'ai entrepris de me documenter un peu sur Perl pour traduire rapidement son script en PHP, extraction compris (le plus simple à mon goût).
J'ai casiment réussi à tout comprendre de son code, cependant je bute sur une petite partie, et j'avoue que je m'arrache un peu les cheveux là (bon sang...). La voici :
Donc j'aimerais qu'une personne qui soit plus à l'aise que moi en Perl m'explique ce que le gars fait à ce moment là.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $int = unpack("N", pack("H8", substr("0" x 8 . "$offset", -8))); $dec = sprintf("%d", $int);
Le script complet est ici :
J'espère que quelqu'un pourra me donner une explication.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 %ext = (); open (INDEX, "CA013R.txt"); @index = <INDEX>; $size = @index; $marker = 1; while ($marker <= $size) { ($offset2, $lba2, $extension2, $description2) = split(/\t/, $index[$marker]); ($offset, $lba, $extension, $description) = split(/\t/, $index[$marker - 1]); $ext{$extension}++; $filename = "mushi" . $ext{$extension} . "." . lc($extension); $int = unpack("N", pack("H8", substr("0" x 8 . "$offset", -8))); $dec = sprintf("%d", $int); $int2 = unpack("N", pack("H8", substr("0" x 8 . "$offset2", -8))); $dec2 = sprintf("%d", $int2); if ($dec2 == 0) { $dec2 = "End of file"; } print "Extracing $extension file from $dec to $dec2 as $filename\n"; `gimme.exe CA013R.PDM $filename $dec $dec2`; $marker++; }![]()
Partager