2009-02-02 78 views
15

我正在C++非托管项目中工作。从C++的std :: string获取字节

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

在C#我做

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

我需要知道的是如何做相同的,但使用非托管C++。

谢谢!

+0

显然这是关于C++干。我修复了输入错误 – 2009-02-02 21:46:55

+0

是的,你是对的,谢谢 – Vic 2009-02-02 22:24:35

回答

24

如果你只需要只读访问,然后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

如果他想要一个字节数组,他是否需要终止'\ 0'?在这种情况下,您可以使用data()作为只读。 – 2009-02-02 22:37:23

+0

我不确定他是否需要\ 0或不。如果他现在不知道他可以使用.data()。感谢您对此发表评论,Martin。 – 2009-02-02 22:48:44

1

从一个std ::字符串,如果你想在char_t缓冲区指针,你可以使用c_ptr()方法。

它看起来像你只是想将字符串的字符复制到一个新的缓冲区。我会简单地使用std::string::copy功能:

length = str.copy(buffer, str.size()); 
0

如果这仅仅是普通的香草C,则:

strcpy(buffer, text.c_str()); 

假定缓冲区分配和大到足以容纳的“文”的内容,这是你原来的代码中的假设。

如果加密()以“为const char *”,那么你可以使用

encrypt(text.c_str()) 

,你不需要复制字符串。

3

通常,加密函数采取

encrypt(const void *ptr, size_t bufferSize); 

作为参数。您可以直接传递c_str和长度:

encrypt(strng.c_str(), strng.length()); 

这样,额外的空间就会被分配或浪费。

18

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

unsigned char buffer[mystring.length()]; 
memcpy(buffer, mystring.data(), mystring.length()); 

STL的fanboys会鼓励你使用std::copy代替:

std::copy(mystring.begin(), mystring.end(), buffer); 

但是这确实没什么好处。如果你需要空终止使用std::string::c_str()和其他人提供的各种字符串重复技术,但我通常会避免这种情况,只是查询length。特别是对于密码学,你只是知道有人会试图通过推入空值来破解它,并且使用std::string::data()来阻止你对字符串中潜在的位进行懒惰的假设。

1

如果你只是需要读取数据。

encrypt(str.data(),str.size()); 

如果您需要将数据的读/写副本放入矢量中, (不要动态分配空间,这是矢量的工作)。

std::vector<byte> source(str.begin(),str.end()); 
encrypt(&source[0],source.size()); 

当然,我们都假设字节是char!

-6

我不认为你想使用你在那里的C#代码。它们提供System.Text.Encoding.ASCII(也UTF-*)

string str = "some text; 
byte[] bytes = System.Text.Encoding.ASCII.GetBytes(str); 

你的问题是忽略C#中的编码不是你的C++代码

相关问题