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 :

Stockage séquence C


Sujet :

C

  1. #21
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Je ne suis pas sûr t'avoir bien compris ton problème.
    Tu as donc un fichier texte. Il contient des données écrites en binaires (sous forme de caractères), chaque donnée étant codée sur x_bits. Les données sont des entiers non signés (apparemment).

    Tes données sont codées sur x_bits et il te faut un entier de taille suffisante pour stocker la valeur d'un entier de x_bits. Un unsigned int ne garantit que 16 bits donc x_bits doit alors être inférieur ou égal à 16. Si tu as besoin de plus, utilise un unsigned long qui te garantit 32 bits.

    La taille du tableau qui stocke les caractères du fichier avant conversion doit être en correspondance (+1 pour le zéro terminal)
    La conversion doit être effectuée par strtoul, puisque tes données sont non signées.

    Une trame possible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    unsigned long read_bits_sequence(FILE* dat,unsigned int x_bits)
    {
    ...                 // Vérifier que x_bits <=32
    unsigned long seq;
    char sequence[33];  // Et non pas char * sequence[] et non pas const puisqu'on veut mettre des choses dedans
    ....                // Lecture de x_bits chars. Attention à la fin de fichier ?
    sequence[x_bits]=0; // Le zéro terminal
    seq=strtoul(sequence, NULL, 2);
    return seq;
    }

  2. #22
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par DelilahHinxs Voir le message
    C'est ca que j'ai avec hexedit...je poste un lien vers mon fichier de suite
    OK. C'est donc un fichier de caractères '0' ou '1. Il n'est pas organisé en lignes, mais en une seule séquence. La longueur de 165 caractères (non multiple de 8) est fixe ou elle peut être plus grande ?

    Voila un exemple qui extrait les caractères, les transforme en valeurs numériques et les stocke par groupe de 8 bits dans un tableau. Je considère que le MSB est en tête. Ensuite, je fais un affichage en hexadécimal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    #include <stdio.h>
     
    /* 0 | 1 */
    #define DBG 0
     
    #define FNAME "data_in.txt"
     
    int main (void)
    {
       FILE *fp = fopen (FNAME, "r");
       if (fp != NULL)
       {
          unsigned char tab[(165 / 8) + 1];
          size_t i_bit = 0;
          size_t i_oct = 0;
          unsigned oct = 0;
          int c;
     
          while ((c = fgetc (fp)) != EOF && i_oct < sizeof tab)
          {
             unsigned bit = c - '0';
    #if DBG
             printf ("%u:", bit);
    #endif
             oct |= (bit << i_bit);
     
    #if DBG
             printf (" %02X\n", oct);
    #endif
     
             i_bit++;
             if (i_bit == 8)
             {
                i_bit = 0;
                tab[i_oct] = oct;
                i_oct++;
                oct = 0;
    #if DBG
                printf ("\n");
    #endif
             }
          }
    #if DBG
          printf ("\n");
          printf ("\ni_bit = %u\n", i_bit);
          printf ("\ni_oct = %u\n", i_oct);
    #endif
     
          {
             size_t i;
             for (i = 0; i < sizeof tab; i++)
             {
                printf ("%02X ", tab[i]);
             }
             printf ("\n");
          }
       }
       else
       {
          perror (FNAME);
       }
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    55 54 FA AB 55 AD AA 55 55 A5 AA AA 4C 55 69 55 55 55 55 D5 10
     
    Press ENTER to continue.

  3. #23
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 19
    Par défaut
    Waw exactement ce que je voulais

    mais je vais décoder ! parce que certaines parties me semblent obscure

    Merci!

  4. #24
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 19
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    OK. C'est donc un fichier de caractères '0' ou '1. Il n'est pas organisé en lignes, mais en une seule séquence. La longueur de 165 caractères (non multiple de 8) est fixe ou elle peut être plus grande ?
    Elle peut être beaucoup plus grande...donc je pourrais introduire un paramètre pour que ces séquences soient plus grandes que 8 bits et plus longue que 165 caractères?

    EDIT: Ha oui d'accord mais mais séquences comment sont elles misent dans le tableau?

    Et comment alors stocker des séquences partielles des 165 par exemple des séquences de 8...je fais un tableaux pour chaque? et je fais comment pour intégrer ça dans une fonction?

    Je vais travailler ma fonction directement ici , je vais faire des erreurs dès que vous en voyez des énormes :p dite le moi merci!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    unsigned long read_bits_sequence(FILE* dat,size_t x_bits)
    {
    	/* Variables */
    	unsigned char * stockage_bits;
    	unsigned int i_bits;
    	/* On compte le nombre de bits présents dans le fichier */
    	i_bits = count_nbr_bits(dat);
    	/* Allocation Dynamique */
    	stockage_bits =(unsigned char*) malloc((i_bits/x_bits)+1);
    	if(stockage_bits == NULL)
    	{
    		printf("Erreur allocation dynamique...\n");
    	}
    	printf("Allocation memoire reussie taille du tableau : %d\n",(i_bits/x_bits)+1);
    	/* Lecture */
     
       /* return à faire */
    }

  5. #25
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par DelilahHinxs Voir le message
    Elle peut être beaucoup plus grande...donc je pourrais introduire un paramètre pour que ces séquences soient plus grandes que 8 bits et plus longue que 165 caractères?
    Dans ce cas, il faut prévoir un mécanisme dynamique. Soit une mesure de la taille suivie de la création du tableau, soit un tableau souple que l'on agrandit selon les besoins (par doublage, par exemple), soit une liste chainée.

    J'ai prévu un assemblage par groupe de 8-bit, mais on fait ce qu'on veut (max 32-bit, unsigned long, pour être portable ou 64-bit, unsigned long long, en C99)
    EDIT: Ha oui d'accord mais mais séquences comment sont elles misent dans le tableau?
    Tant qu'il y a écrit <en cours ...>, c'est que je n'ai pas terminé... Je montre l'avancement de mes travaux en publiant les étapes stables du codage au fur et à mesure... C'est terminé.

    Ensuite, je ne vais peut être pas écrire tout le code à ta place... Je t'ai montré le principe de base de la conversion et de l'assemblage....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	unsigned char stockage_bits[(i_bits / x_bits) + 1]; /* Alors là j'ai une erreur il me dit que la dimension est pas constante, normale ca dépend des paramètres de la fonction */
    C'est pour ça qu'il faut utiliser l'allocation dynamique. Tu connais les bases du C ? Parce que ça ne s'invente pas. Le C est un langage simple, mais subtil qui demande un certain temps d'apprentissage. Tu es formé comment ?

  6. #26
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 19
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Dans ce cas, il faut prévoir un mécanisme dynamique. Soit une mesure de la taille suivie de la création du tableau, soit un tableau souple que l'on agrandit selon les besoins (par doublage, par exemple), soit une liste chainée.

    J'ai prévu un assemblage par groupe de 8-bit, mais on fait ce qu'on veut (max 32-bit, unsigned long, pour être portable ou 64-bit, unsigned long long, en C99)

    Tant qu'il y a écrit <en cours ...>, c'est que je n'ai pas terminé... Je montre l'avancement de mes travaux en publiant les étapes stables du codage au fur et à mesure... C'est terminé.

    Ensuite, je ne vais peut être pas écrire tout le code à ta place... Je t'ai montré le principe de base de la conversion et de l'assemblage....

    C'est pour ça qu'il faut utiliser l'allocation dynamique. Tu connais les bases du C ? Parce que ça ne s'invente pas. Le C est un langage simple, mais subtil qui demande un certain temps d'apprentissage. Tu es formé comment ?

    Je suis formé en fortran 90, en C il y a MALLOC en C++ new, mais je ne vois pas comment allouer mon tableaux? je fais un pointeur puis j'alloue avec x_bits , i_bits

  7. #27
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par DelilahHinxs Voir le message
    Je suis formé en fortran 90, en C il y a MALLOC
    Non. Il y a malloc().
    mais je ne vois pas comment allouer mon tableaux? je fais un pointeur puis j'alloue avec x_bits , i_bits
    J'ai donné 3 pistes. La plus simple est la première :

    Lire le fichier caractère par caractères
    compter les caractères (N)
    revenir au debut (rewind())

    Pour un assemblage en groupe de 8 bits, allouer le tableau de type unsigned char d'une taille de (1 + (N/8)) éléments avec malloc().

    etc.

  8. #28
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 19
    Par défaut
    Milles fois merci à vous !

    Avec ces pistes je vais pouvoir avancer très vite et progresser en C!

    J'ai réussit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    unsigned long read_bits_sequence(FILE* dat,size_t x_bits)
    {
    	/* Variables */
    	char * tmp;
    	unsigned int i=0;
    	long int seq=0;
    	/* Allocation Dynamique */
    	tmp =(char*) malloc(x_bits+1);
    	if(tmp == NULL)
    	{
    		printf("Erreur allocation dynamique...\n");
    	}
    	/* Lecture */
    	rewind(dat); // On revient au début du fichier
    	fgets(tmp,x_bits,dat); // On lit une séquence x bits
    	printf("%s\n",tmp);
    	seq = strtol(tmp,NULL,10); // on convertit la séquence en long 
    	printf("%d\n",seq); // On vérifie la valeur de seg 
        return seq;
    }

Discussions similaires

  1. Stockage de paramètres unitaires
    Par ovh dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 07/10/2003, 09h07
  2. [Kylix] stockage d'un tableau d'octets dans interbase
    Par georges1001 dans le forum EDI
    Réponses: 1
    Dernier message: 16/09/2003, 14h14
  3. gain stockage olap
    Par colomban dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 15/05/2003, 15h24
  4. [Stockage] Image dans un fichier XML
    Par ovh dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 30/04/2003, 16h21
  5. Extraire une séquence d'un fichier MPEG
    Par enzosp dans le forum DirectX
    Réponses: 2
    Dernier message: 24/02/2003, 11h30

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