我正在C++非托管项目中工作。从C++的std :: string获取字节
我需要知道如何将字符串这样的“一些数据进行加密”并获得一个字节[]数组,我将使用它作为加密源。
在C#我做
for (int i = 0; i < text.Length; i++)
buffer[i] = (byte)text[i];
我需要知道的是如何做相同的,但使用非托管C++。
谢谢!
我正在C++非托管项目中工作。从C++的std :: string获取字节
我需要知道如何将字符串这样的“一些数据进行加密”并获得一个字节[]数组,我将使用它作为加密源。
在C#我做
for (int i = 0; i < text.Length; i++)
buffer[i] = (byte)text[i];
我需要知道的是如何做相同的,但使用非托管C++。
谢谢!
如果你只需要只读访问,然后c_str()
将做到这一点:
char const *c = myString.c_str();
如果你需要读/写访问,那么你可以将字符串复制到一个载体。矢量为您管理动态内存。你不必惹分配/释放,则:
std::vector<char> bytes(myString.begin(), myString.end());
bytes.push_back('\0');
char *c = &bytes[0];
如果他想要一个字节数组,他是否需要终止'\ 0'?在这种情况下,您可以使用data()作为只读。 – 2009-02-02 22:37:23
我不确定他是否需要\ 0或不。如果他现在不知道他可以使用.data()。感谢您对此发表评论,Martin。 – 2009-02-02 22:48:44
从一个std ::字符串,如果你想在char_t缓冲区指针,你可以使用c_ptr()方法。
它看起来像你只是想将字符串的字符复制到一个新的缓冲区。我会简单地使用std::string::copy功能:
length = str.copy(buffer, str.size());
如果这仅仅是普通的香草C,则:
strcpy(buffer, text.c_str());
假定缓冲区分配和大到足以容纳的“文”的内容,这是你原来的代码中的假设。
如果加密()以“为const char *”,那么你可以使用
encrypt(text.c_str())
,你不需要复制字符串。
通常,加密函数采取
encrypt(const void *ptr, size_t bufferSize);
作为参数。您可以直接传递c_str和长度:
encrypt(strng.c_str(), strng.length());
这样,额外的空间就会被分配或浪费。
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()
来阻止你对字符串中潜在的位进行懒惰的假设。
如果你只是需要读取数据。
encrypt(str.data(),str.size());
如果您需要将数据的读/写副本放入矢量中, (不要动态分配空间,这是矢量的工作)。
std::vector<byte> source(str.begin(),str.end());
encrypt(&source[0],source.size());
当然,我们都假设字节是char!
我不认为你想使用你在那里的C#代码。它们提供System.Text.Encoding.ASCII(也UTF-*)
string str = "some text;
byte[] bytes = System.Text.Encoding.ASCII.GetBytes(str);
你的问题是忽略C#中的编码不是你的C++代码
显然这是关于C++干。我修复了输入错误 – 2009-02-02 21:46:55
是的,你是对的,谢谢 – Vic 2009-02-02 22:24:35