如何计算 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;
}
我想实现带填充的 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;
}