有一个功能可以将MPZ数字设置为zero-terminated string.

int mpz_set_str (mpz_t rop, const char *str, int base);

但是non-zero terminated string没有函数,我想这样做可以避免对字符串的分配和更改.

int mpz_set_strn (mpz_t rop, const char *str, size_t n, int base);

我在gmp-discuss上找到了类似的关于这个的讨论

在我的例子中,我想使用字符串的一部分.我曾try 模拟mpz_set_str函数在后台的作用,但似乎不起作用.

#include <gmp.h>

int main(){

  const char * str_base16 = "354a546fde";

  mpz_t bn;
  mp_size_t xsize;
  mpz_init(bn);

  // setting bn with part of str_base16
  mpz_realloc2(bn, 8*4);
  xsize = mpn_set_str(bn->_mp_d, (unsigned char *)str_base16, 8, 16);
  bn->_mp_size = xsize;

  gmp_printf("%ZX\n", bn);
  
  return 0;
}

输出:

337637766

推荐答案

查看mpz_set_str()的源代码,看起来您可以直接使用低级函数mpn_set_str(),该函数将指针和长度指向从0开始的数字(不是ASCII字符'0').

#include <math.h>
#include "gmp.h"

// Convert the string of decimal digits dig[0..n-1], each in the range 0..9, to
// the integer z. (n >= 1)
void dtoz(mpz_t z, unsigned char const *dig, mp_size_t n) {
    while (n > 1 && *dig == 0)
        dig++, n--;
    mp_size_t s = (M_LN10 / M_LN2 / (8 * sizeof(mp_limb_t))) * n + 2;
    _mpz_realloc(z, s);
    z->_mp_size = mpn_set_str(z->_mp_d, dig, n, 10);
}

int main(void) {
    mpz_t z;
    mpz_init(z);
    unsigned char dig[] = {
        3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9, 3, 2, 3, 8, 4, 6, 2, 6, 4,
        3, 3, 8, 3, 2, 7, 9, 5, 0, 2, 8, 8, 4, 1, 9, 7, 1, 6, 9, 3, 9, 9, 3, 7,
        5, 1, 0, 5, 8};
    dtoz(z, dig, sizeof(dig));
    gmp_printf("%Zd\n", z);
    dtoz(z, dig + 12, 12);
    gmp_printf("%Zd\n", z);
    return 0;
}

C++相关问答推荐

char为16位且Short也为16位的c环境合法吗

GCC:try 使用—WError或—pedantic using pragmas

从内联程序集调用Rust函数和调用约定

Ebpf内核代码:permission denied:invalid access to map value

C语言中字符数组声明中的标准

ATmega328P EEPROM未写入

如何使用指向 struct 数组的指针并访问数组中特定索引处的 struct

函数的限制限定指针参数允许优化调用方函数吗?

每次除以或乘以整数都会得到0.0000

cairo 剪辑区域是否存在多个矩形?

在C++中父进程和子进程中的TAILQ队列同步问题

Tic-tac-toe:从文件加载存储

Printf()在C中打印终止字符之后的字符,我该如何解决这个问题?

我可以创建适用于不同endian的 colored颜色 struct 吗?

将 struct 数组写入二进制文件时发生Valgrind错误

某些EAX值的不同调用方的CPUID结果不一致

C中的char**v*char[]

将char*数组深度复制到 struct 中?

尽管将其标记为易失性,但 gcc 是否优化了我的等待代码?

inline 关键字导致 Clion 中的链接器错误