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 :

Comment écrire un shell qui transforme un code ascii en caractère?


Sujet :

Shell et commandes GNU

  1. #1
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut Comment écrire un shell qui transforme un code ascii en caractère?
    J'espère que je suis dans le bon forum car je n'ai pas trouvé de forum
    dédié au shell (sh, csh ou bash).

    Je voudrais écrire un shell (a priori Bourne) qui prenne en paramètre un nombre
    et qui sorte sur la stdout le caractère dont le code ascii est ce nombre.

    Par exemple, 48 (en hexa) == 110 (en octal) == 72 (en décimal)
    est le code ascii du caractère "H" (hache majuscule).

    Je voudrais écrire un shell "ascii2char" qui,
    lorsqu'on lui passe en paramètre le nombre 48 (ou 110 ou 72, ça m'est égal)
    écrive sur la stdout la lettre "H" (avec ou sans CR LF, ça m'est égal) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    % ascii2char 48
    H
    % ascii2char 48 | od -h
    0000000  480a
    0000002
    J'ai réussi à le faire sans paramètre, par exemple pour les codes 001 et 110 en octal:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    % CtrlA=`echo "A" | tr 'A' '\001'`
    % C48=`echo "A" | tr 'A' '\110'`
     
    % echo "${CtrlA}${C48}" | od -h
    0000000  0148 0a00
    0000003
    Le line feed (0a) est généré par la commande "echo" elle-même,
    mais "${CtrlA}" et "${C48}" contiennent bien juste les caractères de code 01H et 48H.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    % echo "${CtrlA}${C48}" | od -c
    0000000  001   H  \n
    0000003
    Mais, je n'arrive pas à le faire en utilisant un paramètre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    % HH=110
     
    % echo "A" | tr 'A' "${HH}" | od -c
    0000000    1  \n
    0000002
     
    % echo "A" | tr 'A' "\${HH}" | od -c
    0000000    $  \n
    0000002
    Je pourrais même me contenter de:

    mais, manifestement, le code n'est pas interprété comme étant de l'octal:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    % echo ${HH} | od -c
    0000000    \   1   1   0  \n
    0000005
    Quelqu'un saurait-il comment je peux faire?

    Merci d'avance

    )jack(

  2. #2
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    shell "ascii2char" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #
    # Une valeur hexadécimale DOIT commencer par un 0x ( exemple 0x48 )
    # Une valeur octale       DOIT commencer par un 0  ( exemple 0110 )
    # Une valeur décimale     DOIT commencer par un chiffre autre que 0 ( exemple 72 )
    #
     
    echo $1 | awk '{ if ($1 ~ /^0/) { printf("%c",strtonum($1)) } else { printf("%c\n",$1) }}'

    ascii2char 0x48
    H
    ascii2char 0110
    H
    ascii2char 72
    H

    Ci-dessous, les explications nécessaires à la compréhension

    http://www.delorie.com/gnu/docs/gawk/gawk_77.html
    http://www.delorie.com/gnu/docs/gawk/gawk_64.html
    Loi de Murphy:
    La Théorie c'est quand ça ne marche pas mais que l'on sait pourquoi.
    La Pratique c'est quand ça marche mais qu'on ne sait pas pourquoi.
    Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi.

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par BlaireauOne Voir le message
    shell "ascii2char" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #
    # Une valeur hexadécimale DOIT commencer par un 0x ( exemple 0x48 )
    # Une valeur octale       DOIT commencer par un 0  ( exemple 0110 )
    # Une valeur décimale     DOIT commencer par un chiffre autre que 0 ( exemple 72 )
    #
     
    echo $1 | awk '{ if ($1 ~ /^0/) { printf("%c",strtonum($1)) } else { printf("%c\n",$1) }}'

    ascii2char 0x48
    H
    ascii2char 0110
    H
    ascii2char 72
    H

    Ci-dessous, les explications nécessaires à la compréhension

    http://www.delorie.com/gnu/docs/gawk/gawk_77.html
    http://www.delorie.com/gnu/docs/gawk/gawk_64.html
    Excellent!

    beaucoup!

    Honte à moi! Je n'avais pas pensé à regarder du côté de "awk" avec la possibilité de convertir et formater les nombres.

    Encore merci.

    )jack(


  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par BlaireauOne Voir le message
    shell "ascii2char" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #
    # Une valeur hexadécimale DOIT commencer par un 0x ( exemple 0x48 )
    # Une valeur octale       DOIT commencer par un 0  ( exemple 0110 )
    # Une valeur décimale     DOIT commencer par un chiffre autre que 0 ( exemple 72 )
    #
     
    echo $1 | awk '{ if ($1 ~ /^0/) { printf("%c",strtonum($1)) } else { printf("%c\n",$1) }}'

    ascii2char 0x48
    H
    ascii2char 0110
    H
    ascii2char 72
    H

    Ci-dessous, les explications nécessaires à la compréhension

    http://www.delorie.com/gnu/docs/gawk/gawk_77.html
    http://www.delorie.com/gnu/docs/gawk/gawk_64.html
    Juste un détail: le "\n" n'est pas utile.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ echo 72 | awk '{ if ($1 ~ /^0/) { printf("%c",strtonum($1)) } else { printf("%c\n",$1) }}' | od -c
    0000000   H  \n
    0000002
     
    $ echo 72 | awk '{ if ($1 ~ /^0/) { printf("%c",strtonum($1)) } else { printf("%c",$1) }}' | od -c
    0000000   H
    0000001
    Et c'est juste ce qu'il me fallait.

    Re-merci.

    Jacques

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 20/01/2010, 16h04
  2. Réponses: 5
    Dernier message: 12/04/2009, 11h23
  3. Réponses: 25
    Dernier message: 30/09/2007, 11h13
  4. Transformer le code ascii en caractère
    Par Death83 dans le forum C++
    Réponses: 4
    Dernier message: 28/11/2006, 18h10
  5. [PHP-JS] pasteHTML qui transforme le code
    Par jibouze dans le forum Langage
    Réponses: 1
    Dernier message: 28/10/2005, 18h36

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