【问题标题】:XOR Operator C++XOR 运算符 C++
【发布时间】:2012-09-12 08:04:32
【问题描述】:

这里是一个简单的问题。 XOR 运算符 (^) 有问题。我可以很好地异或整数并得到正确的结果;但是,当对两个字符进行异或运算时,不会返回任何内容:

int main() {
    char a = 'a';
    char b = 'b';
    char c;

    c = a^b;
    cout << c << endl;
}

什么都没有发生。没有输出。我在这里做错了什么。我正在尝试使用它对具有给定密钥的字符串进行 XOR 加密,但在此操作时遇到问题。我想我可以获取 ASCII 值并将其转换为相应的字符,但是这个工具将用于加密文件以及纯文本,所以我想不惜一切代价避免这种情况。

【问题讨论】:

  • 正在得到输出,你只是看不到它。
  • 该操作的结果是1,低于 32 左右的 ASCII 值是“不可打印的”。一个代表数据结束,一个是换行,一个是回车,一个是哔声……见asciitable.com(懒得回答,别人做)
  • 只需std::cout &lt;&lt; (int)c &lt;&lt; '\n'; 即可查看。
  • 小提示:如果您使用的是 UNIX/Linux,管道输出到 cat -vt 有助于查看不可打印字符,因为它们被替换为可见符号(在本例中为“^C” )。

标签: c++ encryption xor


【解决方案1】:

'a' ^ 'b' (0x61 ^ 0x62) 得到3,这是一个不可打印的字符ASCIIETX,因此没有打印输出。

【讨论】:

    【解决方案2】:

    'a' ^ 'b'的结果是一个不可打印的字符,即'\3'

    【讨论】:

      【解决方案3】:

      试试这个。

      #include <iostream>
      #include <iomanip>
      
      int main() {
          char a = 'a';
          char b = 'b';
          char c;
      
          c = a^b;
          std::cout << std::hex << static_cast<int>(c) << std::endl;
      }
      

      【讨论】:

      • std::cout &lt;&lt; hex &lt;&lt; c 不起作用... [std::]hex 适用于数字显示,c 仍被视为字符。您需要将 c 转换为 short/int/long....
      • 是的。那应该教我在发布之前编译和测试:)
      【解决方案4】:

      std::ostream::operator&lt;&lt;(而std::coutstd::ostream)输出格式化文本。当您将char 传递给它时,它会尝试格式化和输出一个字符(想想ASCII)。如果char 不是可打印字符,则不会将其打印出来(原因很明显)。如果你想让它输出一个格式化的整数,你需要强制转换它:

      char a = 'a'; // 'a' == 0x61
      char b = 'b'; // 'b' == 0x62
      char c = a ^ b; // 0x61 ^ 0x62 == 0x03
      std::cout << static_cast<int>(c) << std::endl;
      

      不管怎样,如果你使用无格式输出函数std::ostream::write,它会输出无格式字符。但是请注意,因为如果您尝试写出一个不可打印的字符,它会“工作”,但您的控制台不会显示它(因为再次,它是一个不可打印的字符)。

      【讨论】:

      • 'static_cast(c)' 和 '(int) c' 或 'int(c)' 有什么区别?
      • @DavidHunt: static_cast&lt;&gt; 进行一些检查以确保转换或多或少是安全的,例如 - 你不能不小心将 const T* 指针指向 T* (你必须使用const_cast&lt;&gt;),或者从int*double*(你需要reinterpret_cast&lt;&gt;)。
      猜你喜欢
      • 1970-01-01
      • 2010-12-03
      • 2013-04-20
      • 2011-07-21
      • 2013-06-01
      • 2016-10-17
      • 2015-01-16
      • 2019-02-21
      • 2014-01-27
      相关资源
      最近更新 更多