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 :

Conversion hexa / décimal


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2012
    Messages : 324
    Par défaut Conversion hexa / décimal
    Bonsoir tout le monde,
    j'ai un script shell qui s'exécute et rempli un fichier avec des chaines de caratctère dont la forme est la suivante: 6548 1255 1245 ...
    malheureusment, le résullat est retourné sous la forme d'une chaine hexadécimal dont la forme est la suivante FE 06 92 74 15 87 3B 41. Chaque nombre (exemple 6548) est codé sur 4 caractères hexa. Donc si on veut convertir la chaine FE 06 92 74 15 87 3B 41 au format spécifié plus haut, il va falloir rassembler chaque 4 caractère puis faire une conversion.
    Je ne sais pas comment faire un tel traitement en shell (je l'ai réalisé en java mais c'est impossible d'ajouter une instruction java dans un code shell à ce que je sache).

    merci pour votre aide

  2. #2
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [fpsslt@ln ~] cat > /tmp/toto
    FE 06 92 74 15 87 3B 41
    ^D
    [fpsslt@ln ~] sed 's/\(..\) \(..\)/\1\2/g' /tmp/toto
    FE06 9274 1587 3B41
    [fpsslt@ln~]
    peut être une solution en redirigeant le résultat vers le fichier de sortie bien sur.
    si par contre tu veux vraiment convertir en decimal en plus il faut le faire en deux passes

    une pour le regroupement des caractère (en mémoire) et une en convertissant vers le fichier de sortie le résultat final.

    la conversion est simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    [fpsslt@ln ~] toto=F4ED
    [fpsslt@ln ~] echo "ibase=16; ${toto}"|bc
    62701
    [fpsslt@ln ~]
    je te laisses faire la mise en forme mais là tu as tout pour le faire.

  3. #3
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 354
    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 354
    Par défaut
    Bonjour,

    En gros, si je reprends ta réponse frp31 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ cat /tmp/toto
    FE 06 92 74 15 87 3B 41
    $ sed "s/\(..\) \(..\)/\1\2;/g;s/\(.*\)/echo 'ibase=16; \1'|bc/e;s/\n/ /g" /tmp/toto
    65030 37492 5511 15169

  4. #4
    Membre très actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2012
    Messages : 324
    Par défaut
    merci beaucoup pour cette réponse rapide.
    Je vais tester tout ça et je vous tiendrai au courant.

  5. #5
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Le regroupement de 2 fois 2 chiffres hexa n'inversent-il pas les deux groupes de chiffres?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ sed "s/\(..\) \(..\)/\2\1;/g;s/.*/echo 'ibase=16; &'|bc/e;s/\n/ /g" /tmp/toto
    NB1: Inversion de \1 et \2
    NB2: Comme une seule référence arrière est nécessaire, j'ai supprimé les parenthèses et mis & à la place de \1 car il représente tout ce qui a correspondu.

  6. #6
    Membre très actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2012
    Messages : 324
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Bonjour,

    En gros, si je reprends ta réponse frp31 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ cat /tmp/toto
    FE 06 92 74 15 87 3B 41
    $ sed "s/\(..\) \(..\)/\1\2;/g;s/\(.*\)/echo 'ibase=16; \1'|bc/e;s/\n/ /g" /tmp/toto
    65030 37492 5511 15169
    j'ai testé cette méthode et elle fonctionne très bien. Mais j'ai un problème qui n'a aucune relation avec le script. Au fait j'en ai deux:
    - le résultat affiché par la requête se trouve parfois divisé sur 2 ou trois lignes, choses que j'arrive pas à régler (pourtant il n'y a aucune raison pour retourner à la ligne),
    - la chaine est entouré de " "
    donc finalement mon fichier se présente la forme suivante
    "02 04 FE 06 92 74 15 87 3B 41 "
    "02 0A FE 06 92 74 15 87 00 AE 1D 79 1D 79 1D 79
    1D 79 1D 79 DB 8B "
    "02 0A FE 06 92 74 15 87 00 AE 1D 79 1D 79 1D 79
    1D 79 1D 79 DB 8B "
    "02 0A FE 06 92 74 15 87 00 AE 1D 79 1D 79 1D 79
    1D 79 1D 79 DB 8B "
    "02 0A FE 06 92 74 15 87 00 AE 1D 79 1D 79 1D 79
    1D 79 1D 79 DB 8B "
    "02 0A FE 06 92 74 15 87 00 AE 1D 79 1D 79 1D 79
    1D 79 1D 79 DB 8B "

    je veux que ça soit sous cette forme pour que ton script fonctionne comme il faut
    FE 06 92 74 15 87 3B 41
    FE 06 92 74 15 87 00 AE 1D 79 1D 79 1D 79 1D 79 1D 79 DB 8B
    FE 06 92 74 15 87 00 AE 1D 79 1D 79 1D 79 1D 79 1D 79 DB 8B
    FE 06 92 74 15 87 00 AE 1D 79 1D 79 1D 79 1D 79 1D 79 DB 8B
    FE 06 92 74 15 87 00 AE 1D 79 1D 79 1D 79 1D 79 1D 79 DB 8B
    FE 06 92 74 15 87 00 AE 1D 79 1D 79 1D 79 1D 79 1D 79 DB 8B
    comment faire??
    merci

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 663
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    awk '{if($0!~"\"$"){p=$0; getline}
       $0=p OFS $0
       gsub(" *\"","")
       for(i=1;i<=NF;i++){
          if(i%2)c=$i; else{printf("%d ", strtonum("0x"c""$i));c=""}
       }
       print ""
    }' fichierIn
    la prochaine fois commence par nous donner tout de suite un aperçu du fichier réel !
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    j'ai testé cette méthode et elle fonctionne très bien
    Et bien moi, je ne crois pas. Tu as un résultat et ce résultat est faux. Pour t'en convaincre voici deux commandes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ od -t x1 initial.txt 
    0000000 46 45 20 30 36 20 39 32 20 37 34 20 31 35 20 38
    0000020 37 20 33 42 20 34 31 0a
    0000030
    $ od -t x2 initial.txt 
    0000000 4546 3020 2036 3239 3720 2034 3531 3820
    0000020 2037 4233 3420 0a31
    0000030


    Sinon, pour les guillemets, tu peux faire ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ sed '/[0-9A-F] $/{N;s/\n//};s/\"//g;s/.. .. //' ton_fichier.txt
    FE 06 92 74 15 87 3B 41 
    FE 06 92 74 15 87 00 AE 1D 79 1D 79 1D 79 1D 79 1D 79 DB 8B 
    FE 06 92 74 15 87 00 AE 1D 79 1D 79 1D 79 1D 79 1D 79 DB 8B 
    FE 06 92 74 15 87 00 AE 1D 79 1D 79 1D 79 1D 79 1D 79 DB 8B 
    FE 06 92 74 15 87 00 AE 1D 79 1D 79 1D 79 1D 79 1D 79 DB 8B 
    FE 06 92 74 15 87 00 AE 1D 79 1D 79 1D 79 1D 79 1D 79 DB 8B

  9. #9
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 354
    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 354
    Par défaut
    Pas testé la partie bc (pas installer chez moi):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n ':deb;/\"$/!{N;s/\n//g;b deb};s/"//g;s/\(..\) \(..\)/\1\2;/g;s/\(.*\)/echo "ibase=16; &"|bc/e;s/\n/ /g' /tmp/toto

  10. #10
    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
    Autre solution awk, traitée différemment:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk --non-decimal-data 'NF>4{for(i=1;i<NF;i+=2){printf "%d ","0x"$i$(i+1)};print ""}' RS='"|""' FS=" \n?" fichier
    A noter cependant que le résultat diffère de celui généré par le script de N_Bah. Voici ce que j'obtiens:

    516 65030 37492 5511 15169
    522 65030 37492 5511 174 7545 7545 7545 29 31005 31195 139
    522 65030 37492 5511 174 7545 7545 7545 29 31005 31195 139
    522 65030 37492 5511 174 7545 7545 7545 29 31005 31195 139
    522 65030 37492 5511 174 7545 7545 7545 29 31005 31195 139
    522 65030 37492 5511 174 7545 7545 7545 29 31005 31195 139

Discussions similaires

  1. Conversion Hexa en Décimal
    Par riko7790 dans le forum Général Python
    Réponses: 4
    Dernier message: 23/04/2014, 18h54
  2. Conversion Hexa => binaire => décimal
    Par Matmal11 dans le forum Tcl/Tk
    Réponses: 6
    Dernier message: 10/04/2010, 13h53
  3. Conversion nombre décimal en virgule flottante IEEE 754 (exprimé en hexa)
    Par vinssieux dans le forum Macros et VBA Excel
    Réponses: 36
    Dernier message: 15/05/2008, 09h40
  4. Conversion Hexa -> décimal
    Par Nemesis007 dans le forum C
    Réponses: 3
    Dernier message: 30/04/2007, 15h51
  5. conversion hexa-binaire
    Par jack69 dans le forum C
    Réponses: 8
    Dernier message: 04/04/2005, 16h33

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