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 :

Lecture fichier binaire


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2006
    Messages : 20
    Points : 17
    Points
    17
    Par défaut Lecture fichier binaire
    Bonjour à tous, voilà j'ai un problème de lecture de fichier en perl. Je dois lire un fichier binaire qui contient des suites d'entiers codés sur 1 octets. Qd je fait un sysread de ce fichier, en lui disant de ne lire qu'un octet, il me met la valeur dans une variable caractère, il affiche l'entier en code ascii. Ce n'est pas possible de lire dans le fichier binaire et d'assigner des entiers plutot que des caratères?

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    On ne peut pas lire un entier, on ne peut lire que des suites d'octets, donc de "caractères". Pour obtenir l'entier correspondant à un octet utilise ord(). Si tu stocke des entiers sur plusieurs octets, alors il faut utiliser unpack() pour convertir la string en tableau de valeurs.
    pack()/unpack() sont très pratiques pour manipuler des données en binaire. Par exemple, dans ton cas il est sûrement préférable de lire plus d'un octet et d'utiliser unpack() pour convertir la string résultante en un tableau d'entier.
    Jette un coup d'oeil à la doc :
    fonction unpack (perldoc -f unpack)
    tutoriel sur (un)?pack() (perldoc perlpacktut)

    --
    Jedaï

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    Par défaut
    ca depasse un peu les besoins du posteur original, mais dans le theme du decodage de données binaires je ne saurais que trop vous conseiller le module Parse::Binary (et en particulier Parse::Binary::FixedFormat, suffisant dans la plupart des cas), et dans un genre un poil different (et plus rapide), Convert::Binary::C
    Recherche staigiaire(s) motivé(s) sur projet perl/reseau a grande echelle. Me contacter par mp.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2006
    Messages : 20
    Points : 17
    Points
    17
    Par défaut
    ok merci beaucoup pour vos réponses, j'ai réussi ce que je voulais faire grace à la fonction unpack() de perl.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2006
    Messages : 20
    Points : 17
    Points
    17
    Par défaut
    Bonjour, voilà j'ai utilisé le principe inverse qui consiste à lire des données dans une db, ensuite les formater pour les écrire dans un fichier binaire. Pour formater les données, j'utilise la fonction pack() ex: pack("n",$row[2]);
    Tout fonctionne bien sauf pour la valeur 10. quand j'ai un 10 dans la db, le programme le format avec le pack(), ensuite je print dans mon fichier seulement voilà dans mon fichier il a ajouté un saut de ligne. du coup mon fichier ne fait plus la taille requise et je ne sais plus l'utiliser... je sais que le 10 est le saut à ligne en ascii mais je ne vois pas pourquoi il ajoute un saut de ligne à mon fichier vu que le 10 a été formaté.

  6. #6
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    C'est probablement parce que tu écris en mode texte dans tes fichiers (et que tu es sous windows).
    Pour ouvrir un fichier en mode binaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    open my $filehandle, '>:raw', "chemin du fichier"
        or die "$!\n";
    Pour mettre un fichier $filehandle en mode binaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    binmode $filehandle;
    # ou pour un glob :
    binmode FILEHANDLE;
    Pour mettre un fichier en mode texte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    binmode $filehandle, ':crlf';
    (N'oublie pas de lire en mode binaire aussi)
    --
    Jedaï

Discussions similaires

  1. Lecture fichier binaire et inversion d'octets
    Par zoro_le_renard dans le forum Fortran
    Réponses: 8
    Dernier message: 17/07/2007, 20h35
  2. lecture fichier binaire de double
    Par sandra771 dans le forum C
    Réponses: 6
    Dernier message: 10/11/2006, 16h42
  3. Lecture fichier binaire
    Par djidji dans le forum Langage
    Réponses: 1
    Dernier message: 09/11/2006, 11h58
  4. Réponses: 5
    Dernier message: 02/10/2006, 22h54
  5. Lecture fichier binaire
    Par gabule dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 30/05/2006, 15h53

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