将XOR函数转换为返回char *而不是字符串

时间:2013-03-16 20:12:56

标签: c++ xor

我使用字符串对此XOR进行了编码,但我现在需要返回一个char *。我一直试图这样做几个小时,虽然我不习惯使用char。我想我在这里错过了一些东西。

string XOR(string s, int key){

 string res = "";

 for (size_t temp = 0; temp < s.size(); ++temp){
  res += s[temp] ^ ((key + temp) % 255);
 }
 return res;

}

我怎么能改变这个以得到一个char *作为回报?

编辑澄清:我需要一个char *:char * XOR(string s,int key)

2 个答案:

答案 0 :(得分:2)

编辑:它是buged,但在@JonathanGrynspan和@john的帮助下纠正,现在我的最终版本是:

我知道这不是很美,但它可以做你想要的:

char* XOR(string s, int key){
 string res = "";
 for (size_t temp = 0; temp < s.size(); ++temp){
  res += s[temp] ^ ((key + temp) % 255);
 }
 char * cstr = new char [res.length()+1];
 copy(res.begin(),res.end(),cstr);
 return cstr;
}

答案 1 :(得分:1)

您的输入字符串是否可以覆盖?如果是这样,这是最简单且可能最快的方法:

void XOR( char *input, int key ){
    for(int temp = 0; input[temp] != '\0'; ++temp){
        input[temp] ^= (key + temp) % 255;
    }
}

它改变给定的字符串而不是返回新的东西。但是,由于你有可能在输出中获得\0个字符,你可能会发现它更可靠:

void XOR( char *input, int key, int length ){
    for(int temp = 0; temp < length; ++temp){
        input[temp] ^= (key + temp) % 255;
    }
}

(显然长度不变)

更新

看到评论后,也许这就是你想要的。但要小心 ;你需要记住释放返回的内存,这不是C ++的东西 - 只有程序员习惯;

char *XOR( const string &s, int key ) {
    const std::size_t l = s.size( );
    char *r = (char *) malloc( (l + 1) * sizeof( char ) );
    for( std::size_t i = 0; i < l; ++ i ) {
        r[i] = s[i] ^ ((key + (int) i) % 255)
    }
    r[l] = '\0'; // only needed if you need a null-capped string, which seems unlikely since your string could well contain nulls anyway
    return r;
}