【问题标题】:Convert XOR function to return char* not string转换 XOR 函数以返回 char* 而不是字符串
【发布时间】:2013-03-17 06:46:46
【问题描述】:

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

【问题讨论】:

  • 你为什么说“得到一个字符作为回报”? C 风格字符串?
  • 请出示您希望创建的方法的建议签名。
  • 您可以从返回的string 中调用c_str() 以获取const char*。
  • 您确实需要澄清“返回字符”的含义。如前所述,您正在询问如何返回单个字符值。我怀疑这就是您的意思,如果是,您需要告诉我们您希望如何确定 char 值。
  • @PeterWood 我不认为你可以在这个函数中做到这一点,因为res 只会从堆栈中弹出。

标签: c++ xor


【解决方案1】:

编辑:有问题,但在@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;
}

【讨论】:

  • 任何尝试使用此函数的结果都会崩溃,因为在函数返回之前,返回地址处的内存所有者已被销毁。
  • 对不起@Jonathan Grynspan,这不是真的,我已经尝试过并且它有效。你试过了吗?
  • @JonathanGrynspan 请参考这个
  • 我误读了您的帖子,错过了new 运算符。这仍然是错误的,因为您将泄漏您使用new 创建的std::string。
  • 其实还是错了。 strcpy() 不安全,不应该使用(你的编译器可能会警告你。)在这种简单的情况下没关系,但你应该用std::copy(res.begin(), res.end(), cstr); 替换它。
【解决方案2】:

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

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;
    }
}

(显然长度没有改变)

更新:

看过cmets后,也许这就是你想要的。但要小心;您需要记住释放返回的内存,这不是纯 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;
}

【讨论】:

  • 谢谢,但我不想给出长度。实际上我需要一个 char* 而不是 char 所以我想要做的函数的签名是 char* XORED(string s, int key);我试图用 c_str() 获得一个 const char* 但我失败了.. 但我想有更好的方法来做到这一点
  • @user2177904 查看更新后的答案。我认为最终的代码是你想要的。
猜你喜欢
  • 2020-10-15
  • 2013-05-16
  • 1970-01-01
  • 2015-03-03
  • 1970-01-01
  • 1970-01-01
  • 2017-05-23
  • 1970-01-01
相关资源
最近更新 更多