我使用字符串对此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)
答案 0 :(得分:2)
我知道这不是很美,但它可以做你想要的:
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;
}