#c #gnu #bignum
#c #gnu #bignum
Вопрос:
Я пишу программу с GNU Bignum, и то, что я хочу сделать, это просто прочитать двоичный файл и использовать необработанные данные в виде целого числа Bignum, но всякий раз, когда я читаю этот файл, даже если он имеет длину около 2 МБ, и пытаюсь напечатать число, оно выдает мне очень маленькое число, например 67 или 300, я пробовал это с другими файлами, и все это ведет себя одинаково. приведенный ниже исходный код может дать вам, ребята, представление о том, о чем я говорю.
#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 zeron");
}
else
{
printf("first byte OKnFile length %lun Data read %dn",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 %Zdn",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
считывание меньшего количества данных, чем вы хотите, и, следовательно, ваши малые значения.
Комментарии:
1. Большое спасибо, теперь это работает, я действительно чувствую себя виноватым за свою беспечность.