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

时间:2009-02-02 21:28:58

标签: c++ string

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

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

在C#中我做

  for (int i = 0; i < text.Length; i++)
    buffer[i] = (byte)text[i];

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

谢谢!

8 个答案:

答案 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 ++代码