0

我使用字符串对这个 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)

4

2 回答 2

2

编辑:它有问题,但在@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;
}
于 2013-03-16T20:50:00.443 回答
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;
}
于 2013-03-16T20:23:19.820 回答