2011-05-01 4 views
0

J'écris un programme avec GNU Bignum et ce que je veux faire est simplement de lire un fichier binaire, et d'utiliser les données brutes comme un entier Bignum, mais chaque fois que je lis ce fichier même s'il fait environ 2MB de long et essaie d'imprimer le nombre qu'il me donne un très petit nombre comme 67 ou 300, je l'ai essayé avec des fichiers différents et tout se comporte de la même manière. le code source ci-dessous pourrait vous donner une idée de ce dont je parle.Comment convertir des données brutes en entiers en utilisant C et GMP_Bignum

#include <stdlib.h> 
#include <stdio.h> 
#include <gmp.h> 
#include <string.h> 


int main() 
{ 
    mpz_t data_in; 
    mpz_t data_out; 
    FILE *in_file; 
    FILE * out_file; 
    unsigned long file_length; 
    void* data; 

    //initialize data 
    mpz_init(data_in); 
    mpz_init(data_out); 

    in_file = fopen("main.c","rb"); 
    out_file = fopen("out.txt","wb"); 

    //get file length. 
    fseek(in_file,0,SEEK_END); 
    file_length = ftell(in_file); 
    fseek(in_file,0,SEEK_SET); 

    //allocate memory. 
    data = malloc(file_length); 

    //read file into memory. 
    fread(data,file_length,1,in_file); 
    //check to see if the first byte is zero 
    /*if(data[1]== 0) 
    { 
     printf(" first byte zero\n"); 
    } 
    else 
    { 
     printf("first byte OK\nFile length %lu\n Data read %d\n",file_length,strlen(data)); 
    } 
    */ 

    //import data as integer. 
    mpz_import(data_in,1,file_length,sizeof(data[0]),0,0,data); 

    //output number in the screen 
    gmp_printf(" Data is %Zd\n",data_in); 
    mpz_out_str(NULL,10,data_in); 


    fclose(in_file); 
    fclose(out_file); 


    return 0; 

} 

Qu'est-ce qui pourrait ne pas fonctionner ici?

Répondre

1

Je pense que vous avez les deuxième et troisième arguments à mpz_import inversée, je pense que vous voulez que ce (avec des commentaires laids pour plus de clarté):

mpz_import(
     data_in,    /* mpz_t rop  */ 
     file_length,   /* size_t count */ 
     1,      /* int order  */ 
     sizeof(data[0]),  /* int size  */ 
     0,      /* int endian  */ 
     0,      /* size_t nails */ 
     data     /* const void *op */ 
); 

Le résultat de renverser les deuxième et troisième arguments seraient être mpz_import lecture moins de données que vous voulez et donc vos petites valeurs.

+0

Merci beaucoup, ça marche maintenant, je me sens vraiment mal d'être négligent. – Marauder

Questions connexes