我已经在C中使用OpenSSL库很长一段时间了,但现在我需要迁移到C ++。 OpenSSL的文档描述了这样的MD5功能。
unsigned char *MD5(const unsigned char *d, unsigned long n,
unsigned char *md);
我想将string
类型的变量传递给该函数,但它只接受char *
。
是否可以直接在C ++中将string
传递给char *
类型的参数?(我不想对{{1}类型的变量使用额外的操作})
答案 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)
在你的程序中,如果你开始在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]);