所以基本上使用我正在使用的库我不能使用std :: string,因为它使用了一些有点折旧的C ++版本我需要将这个xor函数从使用std :: string转换为仅使用char或char *。我一直在尝试,但我无法弄清楚我做错了什么,因为我得到了一个错误。这是代码:
string encryptDecrypt(string toEncrypt) {
char key[] = "DSIHKGDSHIGOK$%#%45434etG34th8349ty"; //Any chars will work
string output = toEncrypt;
for (int i = 0; i < toEncrypt.size(); i++)
output[i] = toEncrypt[i] ^ key[i % (sizeof(key) / sizeof(char))];
return output;
}
如果有人能帮助我,那就太好了。我不确定为什么我不能通过简单地将字符串更改为char *来实现。
编辑:
我试过的是:
char * encryptDecrypt(char * toEncrypt) {
char key[] = "DSIHKGDSHIGOK$%#%45434etG34th8349ty"; //Any chars will work
char * output = toEncrypt;
for (int i = 0; i < sizeof(toEncrypt); i++)
output[i] = toEncrypt[i] ^ key[i % (sizeof(key) / sizeof(char))];
return output;
}
请注意我没有尝试将std :: string转换为char,我根本无法在此函数的任何实例中使用std :: string。因此,我的问题没有得到解答。在标记回答之前,请仔细阅读我的问题......
答案 0 :(得分:2)
这里的问题是
char * output = toEncrypt;
这使得output
指向toEncrypt
,这不是您想要做的。您需要做的是分配一个新的char*
,然后将toEncrypt
的内容复制到output
char * encryptDecrypt(char * toEncrypt) {
char key[] = "DSIHKGDSHIGOK$%#%45434etG34th8349ty"; //Any chars will work
int string_size = std::strlen(toEncrypt);
char * output = new char[string_size + 1]; // add one for the null byte
std::strcpy(output, toEncrypt); //copy toEncrypt into output
for (int i = 0; i < string_size; i++)
output[i] = toEncrypt[i] ^ key[i % (sizeof(key) / sizeof(char))];
return output;
}
由于我们在这里使用动态内存分配,我们需要确保调用者在完成时删除内存,否则会导致内存泄漏。
答案 1 :(得分:2)
sizeof()是一个编译时运算符,用于计算其参数类型的大小。当你执行sizeof(toEncrypt)
时,你真的只是做sizeof(char*)
- 而不是字符串的长度,这就是你想要的。您需要以某种方式指示toEncrypt
字符串的长度。以下是两种可能的解决方案:
为encryptDecrypt
添加一个整数参数,以字符为单位指定toEncrypt
的长度。
如果您知道toEncrypt
永远不会将空字节作为加密/解密的有效字符(不确定您的应用程序),并且可以假设toEncrypt
是空终止的,您可以使用strlen
函数在运行时确定字符串长度。
我建议选项1,因为如果您不小心,strlen
会引入安全漏洞,并且因为它允许在字符串参数中使用空字节。
答案 2 :(得分:0)
你得到什么错误?你可以轻松地使用char *来做同样的事情,我已经包含了一个验证功能的示例程序。这是在VS2012下建立的。
#include <string>
#include <stdio.h>
std::string encryptDecrypt( std::string toEncrypt)
{
char key[] = "DSIHKGDSHIGOK$%#%45434etG34th8349ty"; //Any chars will work
std::string output = toEncrypt;
for (int i = 0; i < toEncrypt.size(); i++)
output[i] = toEncrypt[i] ^ key[i % (sizeof(key) / sizeof(char))];
return output;
}
void encryptDecrypt( char* toEncrypt )
{
char key[] = "DSIHKGDSHIGOK$%#%45434etG34th8349ty"; //Any chars will work
int len = strlen( toEncrypt );
for (int i = 0; i < len; i++)
toEncrypt[i] = toEncrypt[i] ^ key[i % (sizeof(key) / sizeof(char))];
}
int main( int argc, char* argv[] )
{
const char* sample = "This is a sample string to process";
int len = strlen( sample );
char* p = new char[ len + 1 ];
p[len] = '\0';
strcpy( p, sample );
std::string output = encryptDecrypt( sample );
encryptDecrypt( p );
bool match = strcmp(output.c_str(), p) == 0;
printf( "The two encryption functions %smatch.\n", match ? "" : "do not " );
return 0;
}
答案 3 :(得分:-1)
为什么不代替字符串输出= toEncrypt:
char *output = new char[std::strlen(toEncrypt) + 1];
std::strcpy(output, toEncrypt);