使用reinterpret_cast将char *转换为vector <byte>

时间:2015-05-17 13:40:18

标签: c++

我正在使用名为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);

编译时没有错误,但在尝试显示为上面显示的盐时返回一个空字符串。我做错了什么或如何正确地进行转换。任何帮助或建议将受到高度赞赏。

3 个答案:

答案 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