[KSH] Opération sur valeurs hexadécimales

Opération sur valeurs hexadécimales [KSH] - Shell/Batch - Programmation

Marsh Posté le 08-12-2014 à 09:07:32    

Bonjour,
 
J'ai besoin de votre aide car j'ai besoin de lister de lister des valeurs hexadécimales disponibles numérotées de 0000 à FFFF et je ne sais comment m'y prendre.
 
Dans mon cas, j'ai des listes de fichiers nommés de la forme :
 
30C4
30C5
30C6
30C8
30CA
30CC
30CE
30D0
30D6
 
et j'aurai besoin de lister uniquement les "trous" ici par exemple 30C7 mais je ne sais pas du tout comment m'y prendre sachant que cette opération doit consommer le minimum de temps CPU (je ne peux détailler l'environnement mais c'est critique).
 
Merci pour votre aide.


---------------
Hebergement d'images | Le topic de la VR standalone
Reply

Marsh Posté le 08-12-2014 à 09:07:32   

Reply

Marsh Posté le 08-12-2014 à 17:13:13    

Je vois une méthode "bourrin" qui devrait fonctionner, par contre ça coutera surement 1 a 2 sec de temps CPU :s

 

En gros l'idée serait de générer 2 fichiers :
- l'un qui contient la liste de tes fichiers nommé en hexa (FILE1)
- l'autre qui contient la liste des nombres en hexa compris entre 0 et FFFF (si possible créé à l'avance pour éviter de la regénérer à chaque fois)  (FILE2)

 

Ensuite tu peux utiliser la commande "comm" pour sortir ce qui est présent dans "FILE2" et absent de "FILE1"

 

La commande "comm" est très rapide, mais implique que les fichiers soit trié de la même façon via un sort

 

Pour générer le fichier "FILE2" une boucle sur un printf devrait faire l'affaire (peut être qu'il y a mieux, je ne sais pas) :

 
Code :
  1. for i in {0..65535}
  2. do
  3.   printf '%.4X\n' $i
  4. done > FILE2
 

et le comparatif

Code :
  1. comm -13 FILE1 FILE2
 

Edit : même pas besoin de rediriger le ls vers un fichier en fait :

Code :
  1. ls | sort | comm -13 - FILE2
 

Je viens de tester avec un jeu réduit et ça fonctionne nickel. Je pense même que si tu as les 65000 fichiers ça devrait être invisible niveau CPU si FILE2 est généré une fois au préalable

 

Edit2 : Vu que ça m'amusais ce truc, j'ai généré un répertoire avec les 65536 fichiers, j'en ai supprimé 2 et lancé le script en générant à la volée le fichier FILE2. Résultat du time, sur un poste linux de bureau, pas du tout un serveur :

 
Citation :


30C7
7AAA

 

real    0m0.94s
user    0m0.74s
sys     0m0.37s

 

Et le script utilisé :

 
Code :
  1. for i in {0..65535}
  2. do
  3.   printf '%.4X\n' $i
  4. done > FILE2
  5. cd test
  6. ls | comm -13 - ../FILE2



Message édité par Nukolau le 08-12-2014 à 17:47:44
Reply

Marsh Posté le 08-12-2014 à 23:34:36    

Bonsoir,
 
Merci pour cette solution, je testerais ça demain ;)


---------------
Hebergement d'images | Le topic de la VR standalone
Reply

Marsh Posté le 11-12-2014 à 13:06:07    

salut,
 
trouvé sur un autre forum, et adapté au cas présent

Code :
  1. $ { read i; i=$((16#$i)); while read j; do until test $((++i)) -eq $((16#$j)); do printf '%X\n' $i; done; done;} < fichier
  2. 30C7
  3. 30C9
  4. 30CB
  5. 30CD
  6. 30CF
  7. 30D1
  8. 30D2
  9. 30D3
  10. 30D4
  11. 30D5

Reply

Marsh Posté le 12-12-2014 à 11:07:36    

:love:
 
watael, cela fonctionne parfaitement, un grand merci :jap:


---------------
Hebergement d'images | Le topic de la VR standalone
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed