如何以字节为单位计算mpz_class的长度?

How to calculate the length of a mpz_class in bytes?

本文关键字:class mpz 字节 为单位 计算      更新时间:2023-10-16

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

const mpz_class m(argv[1])

m 的长度是多少(以字节为单位(? 谢谢!

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

因此,与其做一些笨拙且非常脆弱的memcopy之类的事情,几乎肯定会在某个时候中断,不如自己构建消息(google关键字:序列化(。这也有一个优点,即您的类可以包含您不想添加到消息中的内容(带有临时结果的缓存或其他实现/优化内容(。

据我所知C++(与 f.ex 不同。C#( 不附带内置序列化支持,但可能存在可以为您完成大量序列化的库。否则,您只需自己编写"数据成员到字节数组"函数即可。

超级简单的例子:

#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;
}