2011-05-01 104 views
0

我正在用GNU Bignum编写一个程序,我想要做的只是读取一个二进制文件,并将原始数据用作Bignum整数,但每当我读取这个文件即使它大约2MB长,并尝试打印它给我一个非常小的数字,如67或300,我已经尝试过不同的文件,它的表现都一样。下面的源代码可能会让你知道我在说什么。如何使用C和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; 

} 

这里有什么问题?

回答

1

我觉得你的第二个和第三个参数mpz_import逆转,我想你想这样(为清楚起见,丑陋评论):

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 */ 
); 

扭转了第二和第三个参数的结果将是mpz_import阅读更少的数据比你想要的,因此你的小值。

+0

非常感谢,现在有效,我真的因为粗心大意而感到不适。 – Marauder 2011-05-01 15:52:11

相关问题