récupération de fichiers CRW dans un flux non borné

récupération de fichiers CRW dans un flux non borné - Algo - Programmation

Marsh Posté le 23-07-2011 à 11:38:51    

Bonjour à tous.
 
J'ai commencé il y a quelques jours à écrire un programme de récupération de données (en C sous Linux mais je compte le porter sur Mac et peut-être Windows).
 
Le but est de pouvoir retrouver ses fichiers après un formatage de carte mémoire. Soit en analysant l'image de la carte mémoire, soit en la lisant directement.
 
Pour la plupart des formats, on peut spéculer relativement facilement (TIFF, JPG, ZIP), contrôler une cohérence et retrouver le fichier exact dans le flux.
 
Par contre, le format de fichier CRW de Canon (pour les appareils compacts) me pose problème car si j'ai bien le HEADER et son marqueur HEAPCCDR, je n'arrive pas à trouver la fin du fichier. J'ai pensé au début a surévaluer sa taille (on trouve systématiquement des tags de miniatures juste avant la fin) légèrement mais avoir des octets en trop rend le fichier invalide. J'ai regardé dans un programme opensource de derawtisation mais non seulement ce programme se sert de valeurs claquées en fonction de l'appareil, mais en plus, il saute presque dès le début en fin de fichier lire des données, ce qui n'est pas possible pour moi, ne connaissant pas cette fin.
 
Reste bien la possibilité de faire de gros calculs en testant quelques millions de possibilités mais le programme risque d'être trèèèèèèès lent.
 
Est-ce que quelqu'un s'est déjà collé à ce genre de chose ou aurait de la documentation plus poussée sur le CRW?
 
Pour le moment, je n'ai trouvé que ça de potable comme doc:
http://www.sno.phy.queensu.ca/~phi [...] n_raw.html
Et un source ici (plus simple que dcraw)
chrome://downloads/media/TeraStock/download/decompress.c

Reply

Marsh Posté le 23-07-2011 à 11:38:51   

Reply

Marsh Posté le 23-07-2011 à 12:57:12    

Bon ben en fait, j'ai fait un mix des deux.
 
Je mouline toutes les combinaisons possibles pour trouver une structure cohérente et pour ne pas perdre de temps, je commence à partir d'une valeur que je suis sûr de retrouver vers la fin du fichier, la marque de l'appareil -> Canon
 
Ça me donne ça (sans les vérifications à ajouter une fois la supposée bonne taille trouvée)
 
 
 

       /* as we don't know the CRW size, we will try every values in a reasonable range */
        offset=CRW_MIN_SIZE;
        while (offset<CRW_MAX_SIZE)
        {
                if (!strcmp(buffer+offset,"Canon" ) && !strncmp(buffer+offset+6,"Canon ",6))
                        break;
                offset++;
 
        }
        if (offset==CRW_MAX_SIZE) return 0;
        logdebug("Camera model=%s",buffer+offset+6);
 
        /* the directory block structure must end after this internal TAG but we don't know where */
        while (offset<CRW_MAX_SIZE)
        {
                speculative_valuedatasize=GetEndianINT(buffer+offset,GET_LITTLE_ENDIAN);
                if (speculative_valuedatasize+header_len+2+10>offset) {offset++;continue;}
                speculative_dircount=GetEndianSHORTINT(buffer+speculative_valuedatasize+header_len,GET_LITTLE_ENDIAN);
                if (header_len+speculative_valuedatasize+2+speculative_dircount*10==offset)
                {
                        logdebug("Probably found a valid Directory Block Structure. Size of file may be %d",offset+4);
                }
                offset++;
        }
        logdebug("end of CRW not found..." );

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed