gpt4 book ai didi

c++ - 如何将 GMP mpz_t/mpz_class 保存到 vector

转载 作者:搜寻专家 更新时间:2023-10-31 01:44:07 27 4
gpt4 key购买 nike

我需要转换 mpz_class类型为 vector<byte>反之亦然。
我实现了这两个功能,但是往返转换被破坏了。

typedef unsigned char byte;

std::vector<byte> mpz_to_vector(std::shared_ptr<mpz_class> x) {
size_t size;
byte *a = (byte *) mpz_export(NULL, &size, 1, 1, 1, 0,x->get_mpz_t());
std::vector<byte> p(a,a+size);
free(a);
return p;
}

std::shared_ptr<mpz_class>vector_to_mpz(std::vector<byte> d) {
mpz_class ptr;
mpz_import(ptr.get_mpz_t(), d.size(), 1, sizeof(mpz_t), 1, 0, (void *) d.data());
auto tmp = std::shared_ptr<mpz_class>(new mpz_class(ptr));
return tmp;
}

最佳答案

避免动态分配,尤其是手动分配:为什么 size 是指向动态分配的 size_t 的指针?
您不需要任何临时缓冲区,因此删除它们。该手册包含用于调整输出缓冲区大小的正确算法。
应用这个,我们得到这个导出商:

std::vector<byte> mpz_to_vector(const mpz_t x) {
size_t size = (mpz_sizeinbase (x, 2) + CHAR_BIT-1) / CHAR_BIT;
std::vector<byte> v(size);
mpz_export(&v[0], &size, 1, 1, 0, 0, x);
v.resize(size);
return v;
}
inline std::vector<byte> mpz_to_vector(std::shared_ptr<mpz_class>& x) {
return mpz_to_vector(x->get_mpz_t());
}

进口商也遭受不必要的复制。
不过,唯一的错误是为 mpz_export 提供了错误的参数。
更正所有给我们的:

std::shared_ptr<mpz_class> vector_to_mpz(const std::vector<byte>& d) {
auto p = make_shared<mpz_class>();
mpz_import(p->get_mpz_t(), d.size(), 1, 1, 0, 0, &d[0]);
return p;
}

顺便说一句:我使用了 make_shared,因为这在良好的实现上比手动执行更有效,并且它可以实现异常安全。

关于c++ - 如何将 GMP mpz_t/mpz_class 保存到 vector<byte>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24016611/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com