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

Langage Perl Discussion :

hexadecimal depuis fichier


Sujet :

Langage Perl

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 274
    Points : 176
    Points
    176
    Par défaut hexadecimal depuis fichier
    Salut,

    Je pose une question de débutant, qui a d'ailleurs sûrement sa réponse dans la FAQ (même si je ne l'ai que brièvement cherchée sans la trouver). En fait j'ai une forte envie de taper mon clavier très fort pour un truc si bête .
    Tout simplement, j'ai un fichier texte qui ne contient que des caractères du type "\x41 \x43 ....", que j'aimerais pouvoir afficher en ascii. Quand je fais un print directement sur cette chaîne, j'obtiens bien les caractères ascii. Par contre quand je l'affiche en provenance du fichier, c'est comme si aucun des caractères n'était interprété ! Je me meurs
    Voici le mini code (même si c'est un peu inutile) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #!/usr/bin/perl -w
    open (LIRE,"/tmp/shellcode.txt") || die("error");
    while(<LIRE>)
    {
    	print STDOUT "$_";
    }
    close(LIRE);
    Ou bien encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #!/usr/bin/perl -w
    open (LIRE,"/tmp/s.txt") || die("error");
     
    $str = <LIRE>;
    print "$str";
     
    close(LIRE);
    Merci d'avance !

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    C'est normal, le programme lit une chaîne de caractères dans ton fichier, et il imprime cette chaîne de caractère.

    Si tu veux récupérer, mes codes ascii, il faut décoder les nombres hexa puis traduire en ascii.

  3. #3
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    En fait, je viens de faire un essai sous le debuger Perl, il y a plus simple. Il suffit de remplacer les backslashes par des zéros:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      DB<1> $c = "\x41 \x43 ...."
     
      DB<2> $c =~ s/\\/0/g;
     
      DB<3> p $c
    A C ....
      DB<4>

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 274
    Points : 176
    Points
    176
    Par défaut
    Merci beaucoup !

    Pourrais tu, si tu le veux bien, m'expliquer la différence fondamentale avec print "\x41 \x43...." ? L'argument passé est considéré, comme en C, comme un const char*, différent du type string ? Je ne programme absolument pas en perl, et je dois avouer que je n'ai pas trop envie de me regarder ces détails vu le peu d'utilisation que j'en fait.
    En tout cas je vais passer le sujet en résolu, merci

  5. #5
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 256
    Points
    12 256
    Billets dans le blog
    1
    Par défaut
    En fait, je ne sais pas trop. Je viens de faire quelques nouveaux essais, pour mieux comprendre ce qui se passe exactement.

    D'abord, en utilisant ta chaîne (avec les backslashes), ça semble marcher, sans avoir besoin de remplacer les backslashes par des zéros, aussi bien à la ligne de commande, :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $ perl -e 'print "\x41 \x43...."'
    A C....
    que sous le debuger:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      DB<1>  print "\x41 \x43...."
    A C....
    Mais si j'utilise les single quotes sous le debugger, ça ne marche pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      DB<1> print '\x41 \x43....';
    \x41 \x43....
      DB<2>
    Ce qui commence à donner un élément de piste: avec les single quotes, c'est la chaîne littérale qui est utilisée, alors qu'avec les guillemets, il y a interpolation et Perl interprète bien les nombres comme des hexadécimaux.

    Dans le cas de ton post d'origine, la chaîne de caractères est lue depuis un fichier et c'est forcément la chaîne littérale lue depuis le fichier qui est considérée, sans interpolation des backslashes. Donc, pour vérifier, je simule la lecture d'un fichier en redirigeant un écho vers le programme Perl avec un pipe Unix:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $ echo "\x41 \x43...." | perl -ne 'print $_;'
    \x41 \x43....
     
    $ echo "\x41 \x43...." | perl -ne 's/\\/0/g; print $_;'
    0x41 0x43....
    La conversion ne se fait pas, et la substitution du backslash par 0 ne marche pas non plus. Toujours parce que c'est une chaîne littérale, semble-t-il, qui est utilisée.

    En revanche, en faisant la double conversion dont je parlais dans mon premier post, ça semble marcher:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $ echo "\x41 \x43...." | perl -ne 's/\\/0/g; print chr hex ($_) for split / /, $_;'
    AC
    Donc, c'est sans doute cette dernière syntaxe que tu dois employer pour la lecture d'un fichier. Le 's/\\/0/g' remplace le '\' par un zéro, le split divise la ligne en caractères hexa individuels, le hex convertit la valeur hexa en valeur décimale et, enfin, le chr convertit la valeur décimale trouvée en caractère ASCII.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Je ne programme absolument pas en perl, et je dois avouer que je n'ai pas trop envie de me regarder ces détails vu le peu d'utilisation que j'en fait.
    Tu as bien tort. Cette simple ligne de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    s/\\/0/g; print chr hex $_ for split / /, $_;
    écrite en 15 secondes, c'est sans doute 50 lignes de code et probablement une bonne heure de codage en C (sans même parler des risques accrus de bug). Mais tout dépend naturellement de si tu es payé à l'heure de travail ou au résultat. Moi, je suis consultant indépendant, je suis payé au résultat. Si j'étais payé à l'heure ou à la ligne de code, peut-être que je travaillerais en C ou en Java (voire en ADA ou même en assembleur)... Quoique... Non, plus trop envie de me prendre la tête avec des langages aussi peu efficaces (en terme de rapidité et concision de codage) quand je peux éviter.

    Bon, je ne faisais que plaisanter dans ce dernier paragraphe, et je ne cherche certainement pas à déclencher une polémique stérile sur les mérites respectifs des différents langages. Tu fais ce que tu veux et, surtout, ça m'est bien égal.

    J'espère tout de même et surtout que les exemples ci-dessus auront un peu éclairé ta lanterne et, surtout, t'auront donné la base d'une solution à ton problème.

    Bonne soirée.

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 274
    Points : 176
    Points
    176
    Par défaut
    Merci beaucoup pour ta réponse détaillée, c'est toujours intéressant de voir comment ça fonctionne, même si on n'en a pas toujours le temps !

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Bonjour,

    La solution que je donne n'est pas en perl mais en shell, mais je la donne (juste pour le fun) car elle est aussi très courte et comme à première vue, tu n'es pas un adepte du perl (ce qui est dommage...):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ cat xxxx
    \x41 \x43....
    \x42 \x45...XX
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ echo -e "$(<xxxx)"
    A C....
    B E...XX
    Bon, ici, la meilleur méthode, est bien celle de perl, puisque plus portable que la méthode en shell...
    Cordialement.

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

Discussions similaires

  1. Problème d'importation depuis fichier xls.
    Par penchu dans le forum Windows Forms
    Réponses: 2
    Dernier message: 13/05/2007, 11h42
  2. Chargement HTML depuis fichier externe
    Par guano dans le forum ActionScript 1 & ActionScript 2
    Réponses: 4
    Dernier message: 17/12/2006, 19h16
  3. [ASE 12.5] MAJ colonne depuis fichier Excel
    Par Thig dans le forum Adaptive Server Enterprise
    Réponses: 1
    Dernier message: 23/11/2006, 14h02
  4. [FOP] Impression pdf depuis fichier fo
    Par teophil dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 05/05/2006, 12h16
  5. Extraction de données depuis fichier .NDX ...
    Par Olif_C dans le forum WinDev
    Réponses: 4
    Dernier message: 30/08/2005, 11h57

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