Forum Programmation.c manipuler un fichier binaire

Posté par  .
Étiquettes : aucune
0
17
juin
2005
bonjour,
voilà mon fichier binaire avec un editeur hexadecimal :

0A B5 08 A1 A2 B1 B2 C1 C2 D1 D2
0C B1 06 A1 A2 C1 C2 D1 D2 E1 E2 F1 F2

avec :

pour le 1er enregistrement :
0A B5 08 A1 A2 B1 B2 C1 C2 D1 D2
--- |-----------les 10 octets------------|
|
le lenght
=
10 octets

pour le 2 ème :
0C B1 06 A1 A2 C1 C2 D1 D2 E1 E2 F1 F2
--- |-----------les 12 octets---------------------|
12
octets


je voudrais :
1- supprimer la sequence d'octets qui correspond à B1 B2 dès que je la trouve dans l'enregistrement dans le fichier.
2- arranger le length de l'enregistrement puisqu'on à supprimer 2 octets de
ce dernier.

alors après le traitement :

08 B5 08 A1 A2 C1 C2 D1 D2
0C A4 B1 06 A1 A2 C1 C2 D1 D2 E1 E2 F1 F2

NB : la séquence B1 B2 peut figurée dans plusieur enregistrement dans le fichiers
Merci
  • # RTFM

    Posté par  . Évalué à 2.

    man stdio is good 4u !
  • # c sux

    Posté par  (site web personnel) . Évalué à 4.

    perso j'aurais pas fait ca en C.


    #!/usr/bin/ruby

    test = '0AB508A1A2B1B2C1C2D1D20CB106A1A2C1C2D1D2E1E2F1F2'
    baddy = 'B1B2'

    testb = [ test ].pack("H*")
    baddyb = [ baddy ].pack("H*")

    outb = ''
    while testb.length > 0
        substring = testb[1, testb[0]]
        testb = testb[1+testb[0] .. -1]
        substring.gsub!(baddyb, '')
        outb += [ substring.length ].pack("C")
        outb += substring
    end

    puts outb.unpack("H*")[0].upcase
  • # C rox

    Posté par  . Évalué à 1.

    Voici un "essai" codé en C. J'ai pas intensivement testé, donc il peu y avoir des bugs:
    #include  <stdio.h>
    #include <string.h>
    static const char sequence[2] = {0xb1,0xb2};
    int main(int argc, char ** argv) {
            int size;
            char buffer[256];
            char * plop;
            FILE * coin;
            if(argc != 2 || (coin = fopen(argv[1],"r")) == NULL)
                    return 1;
            while((size = getc(coin)) != EOF) {
                    fread(buffer,1,size,coin);
                    plop = memchr(buffer, sequence[0],size);
                    if(plop == NULL || *(plop+1) != sequence[1]) {
                            putchar(size);
                            fwrite(buffer,1,size,stdout);
                            continue;
                    }
                    size -= 2;
                    memmove(plop,plop+2,size - ( buffer - plop ) -2);
                    putchar(size);
                    fwrite(buffer,1,size,stdout);
            }
            return 0;
    }
    
    • [^] # Re: C rox

      Posté par  . Évalué à -1.

      ça marche pas.
      le fichier sortant contient toujour: B1B2
      merci pour votre aide
      • [^] # Re: C rox

        Posté par  . Évalué à 1.

        Ben, ca serait cool de filer le soit disant fichier
        car tes explications sont lacunaires et donc j'utilise peu être le mauvais format.
    • [^] # Re: C rox

      Posté par  . Évalué à -1.

      ça marche pas.
      le fichier sortant contient toujour: B1B2
      merci pour votre aide

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.