我正在使用名为botan的库进行加密。但这里的情况与库无关,似乎是c ++或者转换中的一个问题。使用该库创建一个16字节长的向量,如下所示。
SecureVector<byte> salt = rng.random_vec(16);
然后将其转换为字符串,
std::string salt_string ((const char*)salt.begin() , salt.size());
使用Qt我可以将srting视为,
ui->textEdit->append("Salt is : "+ QString::fromStdString(salt_string));
现在我需要将其写入文件并在以后重新生成向量。 它被写入文件,
ofstream outfile ("salt.txt" , std::ios::binary);
outfile.write((const char*)salt.begin(), salt.size());
到目前为止,代码看起来效果很好,并且在读取和重新生成向量时会出现问题。
这是我如何将数据读取到char *数组,
ifstream infile ("salt.txt" , std::ios::binary );
char* salt = new char[16];
infile.read(salt , 16 );
现在我需要重新创建SecureVector<byte>
作为salt2,我尝试使用reinterpret_cast
执行此操作,如下所示
SecureVector<byte> salt2 = reinterpret_cast<byte> (salt);
编译时没有错误,但在尝试显示为上面显示的盐时返回一个空字符串。我做错了什么或如何正确地进行转换。任何帮助或建议将受到高度赞赏。
答案 0 :(得分:8)
reinterpret_cast
不会将一种类型神奇地转换为另一种类型,即使它似乎也是如此。坦率地说,除非你理解做做什么,否则你应该从不使用它。
要使向量包含数组中的字节,请创建向量,然后将字节添加到其中。你不能使用演员表来做到这一点。
SecureVector<byte> salt2(salt, salt + 16);
答案 1 :(得分:1)
很难看,但是由于类型转换,你可能只需要在这里做一个for循环:
for(int i = 0; i < 16; ++i)
salt2.push_back(reinterpret_cast<byte>(salt[i]));
我不认为这样的投射可以工作,因为矢量的布局方式与数组在内存中的布局方式相同,它必须包含其大小等其他信息。
答案 2 :(得分:1)
这里的问题是你的任务:
SecureVector<byte> salt2 = reinterpret_cast<byte>(salt);
您正在将char*
转换为byte
(因此指针正在转换为字节(我假设您打算将其转换为byte*
(请注意额外的{{}} 1}})但是没有编译,所以你取消了*
来看看会发生什么事情))。这样做是不确定的(如果不是一个非常糟糕的主意)。但你有一个字节。
但它编译,因为*
有一个构造函数,它以SecureVector<byte>
作为参数。 size_t
是一个整数,因为它是一个字节,因此编译器生成了一个自动转换,并使用字节作为大小构造了矢量。
您实际想要做的是使用带有指向字节和大小的指针的构造函数。见:SecureVector.
size_t