IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Décoder des données base64 d'un ensemble de fichier


Sujet :

Shell et commandes GNU

  1. #21
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    @disedorgue: solution élégante, pure awk que l'on trouve effectivement sur le net mais, une fois n'est pas coutume, l'appel à un sous process depuis awk semble nettement plus véloce.

    Testé sur un fichier de 50000 lignes:
    • awk avec sous process et récupération du résultat par getline (voir plus haut): 0.193s
    • awk pur: 3.533s (mawk fait un peu mieux: 2.027s)
    • Autre piste en awk pur: http://www.turtle.dds.nl/b64dec.awk Plus rapide: 0.983s mais toujours pas autant que le sous-process.
    • Et enfin perl: 0.227s.

    Faites votre choix!


  2. #22
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 378
    Par défaut
    Bah, je ne suis pas trop étonné que awk soit plus lent, il n'est pas réputé pour être super véloce.
    L'autre script en awk pure, est plus rapide car il traite directement 4 caractères à la fois (tel que prévu par base64) et ne fait que des divisions ou multiplications par 2.
    Par contre, où je suis surpris, c'est le perl légèrement plus lent que le awk + sous process (ce qui montre qu'openssl doit etre bien optimisé).

    PS: Même si ce serait certainement le plus lent, le faire en pure builtin bash, ce pourrait être amusant...

  3. #23
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Bah, je ne suis pas trop étonné que awk soit plus lent, il n'est pas réputé pour être super véloce.
    L'autre script en awk pure, est plus rapide car il traite directement 4 caractères à la fois (tel que prévu par base64) et ne fait que des divisions ou multiplications par 2.
    Par contre, où je suis surpris, c'est le perl légèrement plus lent que le awk + sous process (ce qui montre qu'openssl doit etre bien optimisé).
    Étonnant effectivement. Comme quoi il faut éviter se baser sur des généralités pour tirer des conclusions. Il faut tester. surtout pour un travail répétitif sur de gros fichiers. Sinon, on prend l'outil avec lequel on se sent le plus à l'aise.

    J'ai aussi fait le test en python sur le même fichier: 0,455s. Plus lent que perl. Mais je ne suis pas un cador en python et il y a certainement moyen d'optimiser mon code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import base64, sys
    fp = open(sys.argv[1], "r")
     
    for line in fp:
    	F = line.split(' ; ')
    	if len(F[0]) > 10:
    		F[0]=base64.b64decode(F[0].encode('ascii')).decode('ascii')
     
    	print (' ; '.join(F))

  4. #24
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 378
    Par défaut
    Pour le fun, un petit decodeur base64 en pure builtin bash:
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    #!/bin/bash
     
    LC_COLLATE=C
    enco=$1
    y=""
     
    while [ -n "${enco:$i:1}" ]
    do
     x=${enco:$i:1}
     case $x in
       [a-z])
         x=$(($(printf %d "'$x'") - 71))
         ;;
       [A-Z])
         x=$(($(printf %d "'$x'") - 65))
         ;;
       [0-9])
         x=$(($(printf %d "'$x'") + 4))
         ;;
       +)
         x=62
         ;;
       /)
         x=63
         ;;
       =)
         x=0
         ;;
     esac
     (( x & 32 )) && y="${y}1" || y="${y}0"
     (( x & 16 )) && y="${y}1" || y="${y}0"
     (( x & 8 )) && y="${y}1" || y="${y}0"
     (( x & 4 )) && y="${y}1" || y="${y}0"
     (( x & 2 )) && y="${y}1" || y="${y}0"
     (( x & 1 )) && y="${y}1" || y="${y}0"
     ((++i))
    done
    i=0
    while [ -n "${y:$i:8}" ]
    do
     let z="2#${y:$i:8}"
     s=$s$(printf '\\x'%x $z)
     ((i+=8))
    done
    echo -e "$s"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ bash ./decode_base64.sh TGludXggcm9ja3Mh
    Linux rocks!
    $ bash ./decode_base64.sh SGVsbG8gV29ybGQ=
    Hello World
    Bon, c'est très loin d'être rapide, c'est donc juste pour le fun et un petit dernier avant de bonnes vacances bien méritées.

    Bonnes Vacances !!!

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Ecriture des données d'une table dans un fichier
    Par jeunot0108 dans le forum Forms
    Réponses: 3
    Dernier message: 13/08/2007, 12h49
  2. Réponses: 1
    Dernier message: 29/01/2007, 19h22
  3. Réponses: 2
    Dernier message: 25/01/2007, 13h20
  4. Insérer des données dans une BD depuis un fichier .bat
    Par kurkaine dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 24/11/2006, 08h31
  5. [FTP] ftp_put avec des données base64
    Par brazilpalace dans le forum Langage
    Réponses: 2
    Dernier message: 30/08/2006, 13h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo