2010-11-14 39 views
0

C'est ma première programmation en C, et sur un système UNIX. J'essaie de faire quelque chose d'assez simple. J'ai un fichier binaire qui est une image d'une carte de caméra Compact Flash, et se compose de quelques images JPG. J'essaie de lire le fichier, trouver la séquence d'octets correspondant à FF D8 FF E0, ou FF D8 FF E1, les signifiants du début d'un fichier JPG, puis tout écrire entre ce signifiant et le suivant à un nouveau fichier jpg .Lecture de fichiers binaires en C, sur des systèmes UNIX (Ubuntu 10.10)

En ce moment j'essaie juste d'obtenir mon ordinateur pour imprimer le fichier tel quel, en le lisant dans 512 blocs de taille, la taille indiquée des blocs dans le système de fichiers original. J'ai le code suivant:

#include <fcntl.h> 
#include <unistd.h> 
#include <stdio.h> 

int main (int argc, char *argv[]) 
{ 
    FILE * raw; 
    FILE * currentimage; 
    char buf[512]; 
    char beg1[32] = "11111111110110001111111111100001"; 
    char beg2[32] = "11111111110110001111111111100000"; 

    raw = fopen("card.raw", "rb"); 

    while((fread(buf, sizeof(raw), 512, raw) > 0)) 
    { 
     printf(buf); 
     printf("\n"); 

    } 
} 

Il se contente d'afficher le fichier formaté dans ce que je suppose est ASCII, il ressemble à un tas de charabia. Comment puis-je obtenir ces données au format 1 binaire et 0 ou, mieux encore, hex 0-F?

Toute aide serait grandement appréciée.

P.S. beg1 et beg2 correspondent aux valeurs binaires des valeurs hexadécimales que je recherche, mais elles ne sont pas vraiment pertinentes pour le reste du code que j'ai en ce moment.

Répondre

2

Vous devriez lire ce que printf() fait, comme dans aucune langue PROGRAMMATION que je sais, si vous jamais utiliser des données comme le premier argument à printf. Le premier argument devrait être un modèle, dont la façon dont vous l'avez utilisé devrait être "% s". Pour voir la sortie hexagonale, remplacez votre boucle avec ceci:

int size; 
while((size = (fread(buf, sizeof(raw), 512, raw)) > 0)) 
{ 
    for (int i = 0; i < size; i++) 
    { 
     printf("%2X", buf[i]); 
    } 
    printf("\n"); 

} 

Pour répondre à votre question sur C en avant comparision l'impression: Les données numériques est là dans buf - buf [i] est un omble de -127 à 128 qui contient la valeur. Si vous voulez regarder sa représentation hexagonale, vous pouvez faire:

sprintf(some_other_buffer, "%2X", buf[i]); 

Ensuite, vous pouvez effectuer la manipulation de chaînes sur some_other_buffer, sachant que c'est une chaîne de caractères 2.

+0

Tout va bien je suppose, mais comment obtenir une représentation des données en binaire ou en hexadécimal sans l'imprimer, comme je devrais faire une comparaison sur les données avant de l'écrire dans un fichier? Je n'ai pas vraiment besoin d'imprimer quoi que ce soit dans la version finale de ce programme. – joedillian

+0

@joedillian Vous avez déjà les données binaires, vous les avez lues dans 'buf' Mais cela va prendre beaucoup de temps si vous voulez vraiment extraire ceci à partir d'une image de carte SD. Cette image peut contenir un système de fichiers que vous devrez interpréter. – nos