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

C Discussion :

Curiosité : longueur et codage d'un int [Débutant(e)]


Sujet :

C

  1. #1
    LEK
    LEK est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Points : 470
    Points
    470
    Par défaut Curiosité : longueur et codage d'un int
    Je débute en programmation C (sous windows avec VS2010 - je ne connais encore rien : donc cela pourra expliquer la naïveté ou le manque de sens de certaines questions/remarques). Je suis en train de tester l'écriture et la lecture de fichiers binaires
    et la lecture d'un tutoriel sur le sujet me fait me poser quelques questions :
    En programmant en langage C par exemple, il est possible de produite un fichier binaire d’une remarquable concision et efficacité.
    Mais si vous voulez le rendre portable sur différents systèmes, il sera difficile d’éviter la nécessité de gérer plusieurs versions.
    Ne serait-ce que parce que la longueur d’une instruction ou mot-machine peut varier.
    Si dans mon format je connais exactement la longueur des champs pour les différents types utilisés, cette question ne se pose pas non ?
    (A moins que cette remarque ne fasse aux systèmes 16 bits/32 bits/64 bits auquels je ne comprend pour ainsi dire rien faute d'avoir pu trouver une source fiable et limpide sur le sujet)...
    Dans le reste du tutoriel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Ou pour des questions aussi croustillantes que « l’indianité » ou endianess (dans le cas du « little endian », l’octet le moins significatif d’une donnée de plusieurs bytes est logée à l’adresse mémoire la plus basse. Si on est en « big endian », c’est le contraire).
    Encore une fois, j'imagine que ces différences divent venir des types de plateformes utilisées.
    Mais alors, si mon programme doit lire un fichier produit sur une plateforme en (ou utilisant?) littlle endian comment faire pour le lire
    avec le même programme sur une plateforme gérant le big endian?

    Merci à ceux, pour qui le sujet apparaît moins obscur d'éclairer ma lanterne.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,

    Je pense que cette page du man pourra répondre à ta question.

    J'espère qu'elle suffira à répondre à ta question

  3. #3
    LEK
    LEK est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Points : 470
    Points
    470
    Par défaut
    Merci pour le lien mais il ne semble pas m'apporter beaucoup plus :
    Sur les i80x86, l'ordre des octets de l'hôte est LSB (Least Significant Byte first), c'est à dire octet de poids faible en premier, alors que sur les réseaux, notamment l'Internet, l'ordre est MSB (Most Significant Byte first) octet de poids fort en premier.
    Je comprends par là que sur une architecture de processeur i80x86 l'ordre des octets est LSB (j'entend donc little endian) jusque là pas de problème... Ensuite il est dit que les échanges sur réseau se font en big endian : ok pas de problème.. Mais cela ne répond pas réellement aux questions que je me pose...
    Mais en creusant un peu sur le web, j'ai cru déduire que tout dans ce point est affaire de convention. Donc lorsque j'écrirai mon fichier binaire il faudra que j'indique simplement oralement la convention que j'ai adopté pour qu'on puisse le décoder dans le bon sens... Du coup cette partie de mon tutoriel me semble erronée ou en tout cas confusante...

    Cela dit je n'arrive pas à comprendre concernant la première citation que j'ai reprise comment on peut produire par exemple un fichier en C qui serait plus
    compact/"précis" qu'un fichier écrit en c#/php/autre... Au final sur disque dans tout les cas on a bien les mêmes octets non ?

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par LEK Voir le message
    Donc lorsque j'écrirai mon fichier binaire il faudra que j'indique simplement oralement la convention que j'ai adopté pour qu'on puisse le décoder dans le bon sens...
    Il suffit juste d'utiliser les fonctions htons pour régler les problème d'indianness.


    En programmant en langage C par exemple, il est possible de produite un fichier binaire d’une remarquable concision et efficacité.
    Mais si vous voulez le rendre portable sur différents systèmes, il sera difficile d’éviter la nécessité de gérer plusieurs versions.
    Là il parlent de la compilation. Je trouve que cette citation est un peu ambiguë.
    On ne va gérer qu'une seule version du code mais on la compilera pour plusieurs plate-formes.

    Ne serait-ce que parce que la longueur d’une instruction ou mot-machine peut varier.
    La je pense qu'ils parlent du fichier exécutable.
    Cela dépend déjà de l'OS, si l'OS est 32 ou 64 bits et du processeur.
    En effet, selon l'OS les exécutables n'ont pas le même format.
    Si l'OS est 32 ou 64 bits cela va modifier la taille des adresses.
    Et selon le processeur, les instructions ne sont pas toutes les mêmes, certaines existent chez un type de processeur mais pas dans l'autre etc...

    Pour la taille des type, il suffit soit d'utiliser un bibliothèque portable soit d'utiliser stdint.h

    Juste par curiosité, où as-tu trouvé ce tutoriel?

  5. #5
    LEK
    LEK est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Points : 470
    Points
    470
    Par défaut
    Merci pour les informations supplémentaires.
    Le tuto je l'ai téléchargé sur le web, je vais essayer de retrouver l'adresse et te le reposte.

    Merci encore,
    Lek

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

Discussions similaires

  1. Codage d'un "int" passé par un socket
    Par sylvain.cool dans le forum C++
    Réponses: 4
    Dernier message: 11/12/2012, 17h54
  2. mapping champs de type int avec longueur
    Par elbissat dans le forum Hibernate
    Réponses: 3
    Dernier message: 27/11/2007, 10h45
  3. Curiosité avec strcmp oumauvais codage ?
    Par ChipsterJulien dans le forum C++
    Réponses: 4
    Dernier message: 23/09/2007, 15h25
  4. longueur d'un int undefined
    Par keub51 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 27/04/2007, 11h31
  5. "Conversion" d'un char en int ou longueur
    Par Michaël dans le forum C
    Réponses: 6
    Dernier message: 15/08/2003, 11h40

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