首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将GMP _t/mpz_class保存到vector<byte>?

如何将GMP _t/mpz_class保存到vector<byte>?
EN

Stack Overflow用户
提问于 2014-06-03 13:35:03
回答 1查看 2.1K关注 0票数 2

我需要将mpz_class类型转换为vector<byte>,而另一种情况则相反。

我实现了这两个函数,但是往返转换中断了。

代码语言:javascript
运行
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-03 14:41:59

避免动态分配,特别是手动分配:为什么size是指向动态分配的size_t的指针?

您不需要任何临时缓冲区,所以移除它们。手册包含适当的算法来调整输出缓冲区的大小。

应用这个,我们得到了这个出口商:

代码语言:javascript
运行
复制
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. 提供错误参数。

纠正这一切会让我们:

代码语言:javascript
运行
复制
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,因为这在好的实现上比手动实现更有效,而且它支持异常安全。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24016611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档