Répondre à la discussion
Affichage des résultats 1 à 13 sur 13

écrire en mode binaire



  1. #1
    AmigaOS

    écrire en mode binaire


    ------

    Bonjour

    J’aimerais écrire dans un fichier en mode binaire. (en C)
    Je fais alors :
    fichier = fopen("Image.bmp", "ab") ;
    Pour l’ouvrir.
    Et après je ne sait pas si j’utilise fputs, fputc ou fprintf.
    Et si je doit mettre ce que je veut écrire sous forme binaire, hexadécimal, ou caractère ...

    Merci

    -----

  2. Publicité
  3. #2
    whoami

    Re : écrire en mode binaire

    Bonjour,

    Tu l'as dit toi-même : "J’aimerais écrire dans un fichier en mode binaire.".

    Tu l'ouvres correctement pour ça, donc à partir de là ?

    Les cours/tutos ne manquent pas.

  4. #3
    Jack
    Modérateur

    Re : écrire en mode binaire

    regarde du côté des fonctions fread et fwrite.

    A+

  5. #4
    AmigaOS

    Re : écrire en mode binaire

    En faite je veut, convertir un nombre entier en hexa, et l’écrire en hexa dans un fichier .bmp.
    Et je pensait que pour faire cela, il fallait ouvrir en mode binaire, mais avec ce lui ci on ne peut écrire qu’en texte...
    Sinon le texte irait aussi mais il faudrait alors que je trouve une fonction qui convertit des nombres en chaîne de caractère.

    J'ai essayé :
    void conv_hex (int a, FILE *fichier)
    {
    char g ;
    g = a ;
    fputc (g, fichier) ;
    }
    Mais ça ne marche qu'avec des nombres < 256, car char c'est 8 bit.

  6. #5
    Jack
    Modérateur

    Re : écrire en mode binaire

    En faite je veut, convertir un nombre entier en hexa
    Ca ne veut rien dire. Un nombre est un nombre. La base n'est qu'une manière de l'écrire. N'importe comment toutes les données dans un ordi ne sont représentées que par 2 état, ce qu'on va simplifier en disant binaire.
    Et je pensait que pour faire cela, il fallait ouvrir en mode binaire, mais avec ce lui ci on ne peut écrire qu’en texte...
    Précise parce que là, je n'y comprend rien.

    Sinon le texte irait aussi mais il faudrait alors que je trouve une fonction qui convertit des nombres en chaîne de caractère.
    la fonction fprintf le fait très bien.

    Finalement, je ne vois vraiment pas ce que des caractères vont faire dans un fichier bmp (quoique j'ai ma petite idée ). A mon avis tu pars dans la mauvaise direction et ce serait le;moment de préciser ce que tu veux exactement.

    A+

  7. A voir en vidéo sur Futura
  8. #6
    whoami

    Re : écrire en mode binaire

    Bonjour,

    Un fichier bmp est une image, tu ne peux pas lui coller du texte dessus comme ça.

    (Si c'est bien ça que tu veux faire, sinon je ne comprends pas ce que tu veux)

  9. Publicité
  10. #7
    AmigaOS

    Re : écrire en mode binaire

    ok, je précise
    Mon programme doit créer un fichier .bmp, et y enregistrer les données de l’image, qu’il aura calculer.
    Dans les fichier .bmp il y’a "une entête", le contenue, et éventuellement une palette.
    Pour l’entête je commence par écrire :
    Code:
         fprintf (fichier, "BM6") ;  // en haxa : 42 4D ==> 2 octets
    Puis il faut sur 4 octets, la taille du fichier, que le programme aura aussi calculer.
    Imaginons c’est 2217412o
    Je veut alors que mon fichier contient 000000000101011100010000101111(2) ou 00 21 D5 C4 (16) ou .!ÕÄ en caractères. (Je sait, c’est tout pareil)
    Mon problème est alors d'écrire sur 4 octets : .!ÕÄ ou 00 21 D5 C4 (16) ou le binaire dans mon fichier.
    (J’utilise un éditeur hexadécimal pour visualiser les résultats)

    Voici ma nouvelle fonction inventé (qui marche presque) pour faire cette opération :

    Code:
    void conv_print (unsigned long int  x, FILE *fichier)
    {
         unsigned long int c ;
         char h ;
         c = x & 255 ;
         h = c ;
         fputc (h, fichier) ;
         c = x & 65280 ;
         c = c / 256 ;
         h = c ;
         fputc (h, fichier) ;
         c = x & 16711680 ;
         c = c / 65536 ;
         h = c ;
         fputc (h, fichier) ;
         c = x & 4278190080 ; //[Warning] this decimal constant is unsigned only in ISO C90 
         c = c / 16777216 ;
         h = c ;
         fputc (h, fichier) ;
    }
    Si je n’écrit pas la dernière partie, ce code marche, mais bien-sur que pour 3 octets.
    Sur tout les sites ou j’ai regarder j’ai trouver que "unsigned long int" vas de 0 à 4294967295, mais si je comprend bien d’après le message d’erreur de mon compilateur ça ne marche pas.
    En plus ma fonction est un peu longue. Et je pense qu’il existe sûrement une autre fonction qui marche mieux que la mienne...
    Dernière modification par AmigaOS ; 05/01/2011 à 21h20.

  11. #8
    Jack
    Modérateur

    Re : écrire en mode binaire

    tu as essayé de remplacer ta fonction par:
    Code:
    fwrite(&v,sizeof(unsigned long),1,fichier);
    en supposant que v ait été initialisé comme ceci par exemple:
    Code:
    unsigned long v = 0x0021D5C4;
    A+
    Dernière modification par Jack ; 05/01/2011 à 22h51.

  12. #9
    Jack
    Modérateur

    Re : écrire en mode binaire

    ma solution n'est pas portable en raison des problèmes de little et big endian. La preuve, les données seront stockées à l'envers. Si tu travailles sur un PC, donc équipé d'un µprocesseur little endian, il faut modifier mon post précédent en inversant les octets:
    Code:
    unsigned long v = ;0xC4D52100;
    pour éviter les problèmes de compatibilité, il faut donc sérialiser les données octet par octet.

    Code:
        p = (unsigned char*)&v;
        for (i=3;i>=0;i--){
            fwrite(p+i,1,1,f);
        }
    Avec les déclarations suivantes:
    Code:
        int i;
        unsigned char* p;
    A+

  13. #10
    doul11

    Re : écrire en mode binaire

    bonjour,

    Citation Envoyé par AmigaOS Voir le message

    Code:
    void conv_print (unsigned long int  x, FILE *fichier)
    {
         unsigned long int c ;
         char h ;
         c = x & 255 ;
         h = c ;
         fputc (h, fichier) ;
         c = x & 65280 ;
         c = c / 256 ;
         h = c ;
         fputc (h, fichier) ;
         c = x & 16711680 ;
         c = c / 65536 ;
         h = c ;
         fputc (h, fichier) ;
         c = x & 4278190080 ; //[Warning] this decimal constant is unsigned only in ISO C90 
         c = c / 16777216 ;
         h = c ;
         fputc (h, fichier) ;
    }
    une autre solution :

    Code:
    void conv_print (unsigned long int  x, FILE *pf)
    {
    int i;
    
    for(i=0;i<4;i++)
    	{
    	fputc(x & 0xFF,pf);
    	printf("[%i]=0x%02X\n",i,x & 0xFF);
    	x=x >> 8;
    	}
    }
    le printf n'est pas nécessaire bien sur, c'est juste pour voir si ça marche bien.
    La logique est une méthode systématique d’arriver en confiance à la mauvaise conclusion.

  14. #11
    Philou67
    coresponsable des forums

    Re : écrire en mode binaire

    Citation Envoyé par Jack Voir le message
    pour éviter les problèmes de compatibilité, il faut donc sérialiser les données octet par octet.
    Sauf erreur, ta sérialisation n'est pas non plus portable (elle suppose une endianness constante de la machine du compilateur ; si tu passes sur un micro big-endian par exemple, la sérialisation sera différente).

    En revanche, il existe des fonctions de conversion d'endianness hton* et ntoh* dont une adaptée aux long : htonl
    La conversion s'effectue alors automatiquement vers l'endianness réseau dont je suppose qu'elle est identique à celle adoptée dans le format BMP ? (mais n'en ai pas la certitude).
    :'( Plus j'apprends, et plus je mesure mon ignorance

  15. #12
    Jack
    Modérateur

    Re : écrire en mode binaire

    tu fais bien de le préciser

    A+

  16. Publicité
  17. #13
    AmigaOS

    Re : écrire en mode binaire

    Super, j’ai essayé fwrite, et ça fonctionne !
    Au début je l’avait rechercher sur internet, et en avait mal compris la définition.
    ma solution n'est pas portable en raison des problèmes de little et big endian. La preuve, les données seront stockées à l'envers. Si tu travailles sur un PC, donc équipé d'un µprocesseur little endian, il faut modifier mon post précédent en inversant les octets:
    Je m’y connais pas encore trop en processeur, mais en tout cas le fait que la fonction écrit les données à l’envers est justement ce qu’il me faut, car le BMP est "écrit à l'envers", j’ai oublier de le préciser.

    Mais j’aimerait comprendre pourquoi mon code ne fonctionnait pas... unsigned long int n’est vraiment pas de 0 à 4294967295 ? Ou ça dépend encore de la machine ?

Discussions similaires

  1. [fortran] lire/ecrire un fichier binaire : quelques interrogations sur des syntaxes
    Par bratisla dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 03/03/2010, 12h56
  2. Passage de Binaire Naturel à Binaire reflechis. [1STI]
    Par Aslanto dans le forum Électronique
    Réponses: 7
    Dernier message: 12/11/2009, 20h34
  3. Réponses: 4
    Dernier message: 25/10/2008, 05h26
  4. Réponses: 24
    Dernier message: 19/06/2008, 13h48
  5. [Matlab] Ecrire un espace dans un fichier binaire
    Par jepoirrier dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 12/08/2004, 16h41