Précédent   Forum du club des développeurs et IT Pro > C et C++ > C
C Forum d'entraide technique sur le langage C. Avant de poster -> F.A.Q. C, Avant de poster.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 28/12/2012, 15h29   #1
LEK
Membre éclairé
 
Inscription : mai 2005
Messages : 663
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 663
Points : 387
Points : 387
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 :
Citation:
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 :
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.
LEK est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2012, 15h59   #2
Neckara
Rédacteur
 
Avatar de Neckara
 
Homme Denis
Étudiant
Inscription : décembre 2011
Messages : 2 529
Détails du profil
Informations personnelles :
Nom : Homme Denis
Localisation : France, Loire (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2011
Messages : 2 529
Points : 6 801
Points : 6 801
Envoyer un message via MSN à Neckara Envoyer un message via Skype™ à Neckara
Bonjour,

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

J'espère qu'elle suffira à répondre à ta question
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon.

Chaîne Youtube : Vidéos

Ma page DVP : http://neckara.developpez.com/
Neckara est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2012, 20h49   #3
LEK
Membre éclairé
 
Inscription : mai 2005
Messages : 663
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 663
Points : 387
Points : 387
Merci pour le lien mais il ne semble pas m'apporter beaucoup plus :
Citation:
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 ?
LEK est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2012, 10h58   #4
Neckara
Rédacteur
 
Avatar de Neckara
 
Homme Denis
Étudiant
Inscription : décembre 2011
Messages : 2 529
Détails du profil
Informations personnelles :
Nom : Homme Denis
Localisation : France, Loire (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2011
Messages : 2 529
Points : 6 801
Points : 6 801
Envoyer un message via MSN à Neckara Envoyer un message via Skype™ à Neckara
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.


Citation:
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.

Citation:
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?
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon.

Chaîne Youtube : Vidéos

Ma page DVP : http://neckara.developpez.com/
Neckara est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 20h04   #5
LEK
Membre éclairé
 
Inscription : mai 2005
Messages : 663
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 663
Points : 387
Points : 387
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
LEK est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 12h00.


 
 
 
 
Partenaires

Hébergement Web