2011-05-01 49 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

相關問題