我正在使用C ++非托管项目。
我需要知道如何使用这样的字符串“加密一些数据”并得到一个byte []数组,我将用它作为加密源。
在C#中我做
for (int i = 0; i < text.Length; i++)
buffer[i] = (byte)text[i];
我需要知道的是如何使用非托管C ++。
谢谢!
答案 0 :(得分:27)
如果您只需要只读访问权限,则c_str()
会执行此操作:
char const *c = myString.c_str();
如果您需要读/写访问权限,则可以将字符串复制到矢量中。矢量管理动态记忆。您不必混淆分配/解除分配:
std::vector<char> bytes(myString.begin(), myString.end());
bytes.push_back('\0');
char *c = &bytes[0];
答案 1 :(得分:22)
std::string::data
似乎足够且效率最高。如果你想要非常规内存来操作(加密很奇怪)你可以使用memcpy将数据复制到缓冲区:
unsigned char buffer[mystring.length()];
memcpy(buffer, mystring.data(), mystring.length());
STL粉丝会鼓励您使用std::copy代替:
std::copy(mystring.begin(), mystring.end(), buffer);
但这并没有太大的好处。如果你需要空终止使用std::string::c_str()
和其他人提供的各种字符串复制技术,但我通常会避免这种情况,只是查询length
。特别是对于加密技术,你只知道有人会试图通过推送空值来破解它,而使用std::string::data()
会阻止你懒散地对字符串中的基础位做出假设。
答案 2 :(得分:3)
通常,加密功能需要
encrypt(const void *ptr, size_t bufferSize);
作为参数。您可以直接传递c_str和length:
encrypt(strng.c_str(), strng.length());
这样就会分配或浪费额外的空间。
答案 3 :(得分:1)
如果要获取char_t缓冲区指针,可以使用c_ptr()方法从std :: string中获取。
看起来您只想将字符串的字符复制到新的缓冲区中。我只想使用std::string::copy函数:
length = str.copy( buffer, str.size() );
答案 4 :(得分:1)
如果您只是需要阅读数据。
encrypt(str.data(),str.size());
如果需要数据的读/写副本,请将其放入向量中。 (不要;动态分配作为向量作用的空间)。
std::vector<byte> source(str.begin(),str.end());
encrypt(&source[0],source.size());
当然我们都假设这个字节是字符!!!
答案 5 :(得分:0)
如果这只是简单的香草C,那么:
strcpy(buffer, text.c_str());
假设缓冲区已分配且足够大以容纳“text”的内容,这是原始代码中的假设。
如果encrypt()采用'const char *',那么你可以使用
encrypt(text.c_str())
,您无需复制字符串。
答案 6 :(得分:0)
在 C++11
及更高版本中,您可以使用 std::byte
来表示实际的字节数据。我会推荐这样的东西:
std::vector<std::byte> to_bytes(std::string const& s)
{
std::vector<std::byte> bytes;
bytes.reserve(std::size(s));
std::transform(std::begin(s), std::end(s), std::back_inserter(bytes), [](char c){
return std::byte(c);
});
return bytes;
}
答案 7 :(得分:-7)
我不认为你想使用你在那里的c#代码。它们提供System.Text.Encoding.ASCII(也是UTF- *)
string str = "some text;
byte[] bytes = System.Text.Encoding.ASCII.GetBytes(str);
你的问题源于忽略c#中的编码而不是你的c ++代码