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 :

"Packer" un entier sur 32 bits, peu importe le système


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Mai 2007
    Messages : 52
    Points : 39
    Points
    39
    Par défaut "Packer" un entier sur 32 bits, peu importe le système
    Salut à toutes et à tous,

    J'utilise la fonction pack de PERL afin de créer un fichier binaire qui sera lu par la suite par un programme écrit en C. Le fichier binaire ne contient que des entiers SIGNES dont les valeurs ne dépassent pas les possibilités d'un codage en 32 bits.

    Pour des raisons d'espace mémoire, mais aussi de portabilité, j'aimerais stocker chacun de ces entiers sur 4 octets. Or la fonction PERL pack(), via le format 'i' choisit le nombre d'octet en fonction du système utilisé. Ainsi, sur une machine x86_64, ce sera sur 8 octets. Ceci est pour le moins problématique puisque: 1. Ca prend deux fois plus de mémoire; 2. Le programme C tentera de lire les données 4 à 4 et les données récupérées seront alors biaisées.

    D'un autre côté, il y a la possibilité d'utiliser les formats 'N' ou 'V'. Ces derniers permettent de stocker des données sur 32 bits (soit 4 octets), mais ils doivent être positifs! Or les entiers que je chercher à stocker sont signés.

    D'où ma question: Quel moyen peut-on utiliser pour stocker des entiers signés sur 32 bits (4 octets) dans un fichier binaire avec la fonction pack() de PERL ?


    Et la petite question bonus que j'insère ici même si elle est liée au C: Comment en C peut-on spécifier qu'on lit des données dont l'ordre est "little-endian" ou "big-endian" ?

    Merci par avance pour toute information constructive,
    Mickaël

  2. #2
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Mai 2007
    Messages : 52
    Points : 39
    Points
    39
    Par défaut
    Bonsoir à toutes et à tous,

    Et bien, j'ai trouvé la solution à mon problème, que je poste ici des fois que ça interesserait des personnes dans le futur.

    En fait, en PERL, il suffit de coder les données en long (4 bytes) et le tour est joué!


    Mickaël

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par mkrzemin Voir le message
    Et la petite question bonus que j'insère ici même si elle est liée au C: Comment en C peut-on spécifier qu'on lit des données dont l'ordre est "little-endian" ou "big-endian" ?
    Il existe des fonctions de conversion, habituellement utilisées pour la programmation réseau (d'où le module qui les déclare) :
    http://man.developpez.com/man3/byteorder.3.php

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

Discussions similaires

  1. Déclarer un entier sur 16 bits
    Par awalle dans le forum C
    Réponses: 1
    Dernier message: 25/04/2007, 13h08
  2. Réponses: 1
    Dernier message: 27/07/2006, 16h58
  3. Insérer un entier sur 64 bits dans une base ?
    Par DJZiaK dans le forum SQLite
    Réponses: 1
    Dernier message: 10/05/2005, 17h37

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