将字符串传递给接受指向char的指针的函数

时间:2014-12-22 12:24:43

标签: c++ openssl

我已经在C中使用OpenSSL库很长一段时间了,但现在我需要迁移到C ++。 OpenSSL的文档描述了这样的MD5功能。

unsigned char *MD5(const unsigned char *d, unsigned long n,
              unsigned char *md);

我想将string类型的变量传递给该函数,但它只接受char *是否可以直接在C ++中将string传递给char *类型的参数?(我不想对{{1}类型的变量使用额外的操作})

2 个答案:

答案 0 :(得分:2)

您可以使用c_str运动的std::string成员函数。实施例

std::string data;
// load data somehow
unsigned char md[16] = { };
unsigned char *ret = MD5(reinterpret_cast<const unsigned char*>(data.c_str()),
                         data.size(),
                         md);

如果你想取消丑陋的强制转换操作符,请定义一个包含unsigned char而不是char的字符串类并使用它。

typedef std::basic_string<unsigned char> ustring;
ustring data;
unsigned char *ret = MD5(data.c_str(), data.size(), md);

答案 1 :(得分:2)

只需要一点注意事项,以后可能会让您头疼不已。 MD5将unsigned char指针作为参数。这是一个线索,它实际上不是一个字符串,而是一个指向字节的指针。

在你的程序中,如果你开始在std :: string中存储字节向量,你最终会用一个包含零的字节向量来初始化一个字符串,这就打开了一个错误的可能性。难以察觉。

将所有字节向量存储在std::vector<unsigned char>(或std::vector<uint8_t>中更安全,因为这会强制安全初始化。

std::vector<unsigned char> plaintext;
// initialise plaintext here
std::vector<unsigned char> my_hash(16);
MD5(plaintext.data(), plaintext.size(), &my_hash[0]);