Forum Clubic

C : ordre des bits

Bonjour,

Si j’ecrit un fichier binaire (exemple une image) sur une machine A qui ne représente pas les bits dans le meme maniere que la machine B, mais que je veux pouvoir lire l’image depuis la machine B, comment faire? J’écrit dans mon fichier en faisant des fwrite(&entier,…) par exemple.
En fait j’ai un problème je n’arrive pas à lire mon fichier BMP et je sais pas si le problème viens de là, on si ca n’a rien à voir?

merci

Bon mon problème viens bien de là d’apres ce que j’ai lu, donc y’a t’il une méthode simple pour écrire dans le format que je veux?

Normalement les formats d’images imposent un ordre pour les representation des nombres. Si ta machine A ne les represente pas comme ils doivent etre stockés alors tu dois ecrire une fonction de conversion.

Si ton code est commun sur ta machine A et B, alors il faut une directive de compilation qui pour la machine A active la conversion et pour la machine B ne l’active pas. Tu peux par exemple utiliser une macro.

Le probleme c’est que je cree l’image sur la machine A et je la lit sur la machine B.

J’ai essayé d’ecrire une fonction qui inverse les bits d’un long int (32 bits donc).
Ca ne fonctionne pas, voyez vous une erreur?


long int invert_32(long int li){
    long int li_inverse=0;
    long int tmp;
    int i;
    for(i = 1 ; i <= 32 ; i++){
	tmp = li;
	tmp = tmp<<(i-1);
	tmp = tmp>>31;
	li_inverse+=tmp;
	li_inverse = li_inverse<<1;
    }
    return li_inverse;
}

Tu as les fonctions réseau htons et htonl

www.mkssoftware.com…

Bien que ce soit orienté réseau, tu as l’avantage d’un truc qui fonctionne bien.

(et la problématique réseau est la même, je te rassures :))

Je comprends pas, j’ai créé un bmp, si je l’ouvre avec un editeur hexadecimal, je peux lire tous les champs de l’entete et ils semblent corrects, la taille en octet de l’image correspond exactement aux champs, mais je n’arrive pas à afficher l’image avec paint ou autres (paint me dit ressources insuffisantes, et la seule information utile que j’ai c’est “convert” qui me dit :

convert image.bmp image.png
convert: Length and filesize do not match (image.bmp).

ton image fait quelle taille?

www.clubic.com…

Sans-Nom : 101376 pixels soit 304128 octets + 54 octets pour le header ce qui fait 304182 octets

Karlkox : merci je regarderais ca.

Bon pour l’ente ca marche, elle est lisible, mais l’image n’est pas correcte lorsque je l’ouvre.
Vu que j’ecrit des unsigned char (1 octets / 8 bits donc) pour chaque couleur, comment les remettre dans le bon ordre?

Merci

ESt ce que l’encodate de tes fichiers sont identiques sous les machines :

cf set
=>LANG
ou
=> LC_ALL

je ne vois pas le rapport avec les parametres de langues…?

Hum, me semblait que le problème d’ordre des bits ne concernait que les nombres sur plus d’un byte. Donc à priori, tes char sont laissés tels quels.

ca y est ca marche.
Donc c’etait bien ca, il faut remettre en ordre les variables de 16 et 32 ou plus bits.

Merci