Как преобразовать стандартные необработанные данные в целое число с помощью C и GMP_Bignum

#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. Большое спасибо, теперь это работает, я действительно чувствую себя виноватым за свою беспечность.