从C++中的std :: string获取字节

Vic*_*Vic 21 c++ string

我正在使用C++非托管项目.

我需要知道如何使用这样的字符串"一些数据加密"并得到一个byte []数组,我将用它作为加密的源.

在C#我做

  for (int i = 0; i < text.Length; i++)
    buffer[i] = (byte)text[i];
Run Code Online (Sandbox Code Playgroud)

我需要知道的是如何使用非托管C++.

谢谢!

Joh*_*itb 30

如果您只需要只读访问权限,那么c_str()将执行以下操作:

char const *c = myString.c_str();
Run Code Online (Sandbox Code Playgroud)

如果需要读/写访问权限,则可以将字符串复制到向量中.矢量管理动态记忆.您不必混淆分配/解除分配:

std::vector<char> bytes(myString.begin(), myString.end());
bytes.push_back('\0');
char *c = &bytes[0];
Run Code Online (Sandbox Code Playgroud)

  • 假设它是连续的并不危险,它是向量的保证(在C++规范IIRC中std :: vector下的第一段).如果没有调用某些指定的函数,假设它不会改变是安全的 - 相当于那些可能引起resize()的函数. (4认同)

Chr*_*ith 24

std::string::data似乎是足够和最有效的.如果你想要非常规内存来操作(加密很奇怪),你可以使用memcpy将数据复制到缓冲区:

unsigned char buffer[mystring.length()];
memcpy(buffer, mystring.data(), mystring.length());
Run Code Online (Sandbox Code Playgroud)

STL粉丝会鼓励你使用std :: copy代替:

std::copy(mystring.begin(), mystring.end(), buffer);
Run Code Online (Sandbox Code Playgroud)

但这确实没有太大的好处.如果你需要null终止使用std::string::c_str()和其他人提供的各种字符串复制技术,但我通常会避免这种情况,只是查询length.特别是对于密码学,你只知道有人会试图通过向其推送空值来破解它,并且使用std::string::data()劝阻你懒洋洋地假设字符串中的底层位.