如何计算 mpz_class 的字节长度?

How to calculate the length of a mpz_class in bytes?

我想实现带填充的 RSA,但首先我必须找出消息的字节长度,这是一个 mpz_class 项。 cpp 中的哪个函数可用于完成此操作?

const mpz_class m(argv[1])

m 的字节长度是多少? 谢谢!

@Shawn 的评论是正确的:你的class占用内存的字节不是你应该关心的。字节在内存中的位置不仅取决于编译器决定如何打包它们,而且它们的顺序还可能取决于所使用的硬件。

因此,与其做一些笨拙且非常脆弱的 memcopy 之类的事情,几乎肯定会在某个时候中断,您应该自己构建消息(google 关键字:Serialization)。这还有一个好处,即您的 class 可以包含您不想添加到消息中的内容(具有临时结果的缓存或其他 implementation/optimization 内容)。

据我所知,C++(与 f.ex.C# 不同)没有内置序列化支持,但可能存在可以为您做很多事情的库。否则你只需要自己编写 "data member to byte array" 函数。

超级简单的例子:

#include <vector>
#include<iostream>

class myClass
{
    int32_t a;
public:
    myClass(int32_t val) : a(val) {}

    // Deserializer
    bool initFromBytes(std::vector<uint8_t> msg)
    {
        if (msg.size() < 4)
            return false;

        a = 0;
        for (int i = 0; i < 4; ++i)
        {
            a += msg[i] << (i * 8);
        }
        return true;
    }

    // Serializer
    std::vector<uint8_t> toBytes()
    {
        std::vector<uint8_t> res;
        for (int i = 0; i < 4; ++i)
        {
            res.push_back(a >> (i*8));
        }
        return res;
    }

    void print() { std::cout << "myClass: " << a << std::endl; }
};

int main()
{
    myClass myC(123456789);

    myC.print();

    std::vector<uint8_t> message = myC.toBytes();

    myClass recreate(0);
    if (recreate.initFromBytes(message))
        recreate.print();
    else
        std::cout << "Error" << std::endl;

    return 0;
}