std :: string到BYTE []

时间:2016-12-29 16:19:20

标签: c++ winapi

我的目标是得到这个:

BYTE       Data1[]     = {0x6b,0x65,0x79};
BYTE       Data2[]     = {0x6D,0x65,0x73,0x73,0x61,0x67,0x65};

但我的出发点是:

std::string msg = "message";
std::string key = "key";

我无法从std::string转到BYTE[]

我尝试了以下内容:

std::vector<BYTE> msgbytebuffer(msg.begin(), msg.end());
BYTE*       Data1     = &msgbytebuffer[0];

这没有导致编译或运行时错误。但是,最终结果(我将其提供给winapi函数 - crypto api)与我在最顶层({0x6D,0x65,0x73,0x73,0x61,0x67,0x65})中使用实际字节数组时的结果不同。

2 个答案:

答案 0 :(得分:2)

您可以使用string::c_str()函数返回指向c样式字符串的指针,该字符串可以传递给winapi函数,如:

foo(string.c_str());

它实际上做的是它返回一个指向包含以null结尾的字符序列的数组的指针。

我认为BYTE []实际上是一个char数组。您可以通过执行以下操作将std :: string分配给char数组:

std::string str = "hello";
BYTE byte[6];   // null terminated string;
strcpy(byte, str.c_str());  // copy from str to byte[]

如果要复制末尾没有0的str,请改为使用strncpy

BYTE byte[5];
strncpy(byte, str.c_str(), str.length());

答案 1 :(得分:1)

似乎winapi正在等待一个空终止的c-string。您可以使用以下方法实现:

msg.c_str();

或使用您的BYTE类型,类似:

std::vector<BYTE> msgbytebuffer(msg.length() + 1, 0);
std::copy(msg.begin(), msg.end(), msgbytebuffer.begin());