异或加密字符串并将其保存在文本文件中时,PC 会发出哔哔声

Posted

技术标签:

【中文标题】异或加密字符串并将其保存在文本文件中时,PC 会发出哔哔声【英文标题】:PC makes beeps when XOR encrypting a string and saving it in a text file 【发布时间】:2014-05-30 09:41:04 【问题描述】:

我使用 XOR 来加密我写入文本文件的选项,并在我读入它们时解密它们。

下面是加密选项并将它们写入文件的代码:

Settings settings;
const char key = 'x';

std::stringstream ss;
std::string original = "";
std::string encrypted = "";
std::ofstream file("./data/options.txt");

if (file.good()) 
  file.clear();

  // Build options string
  ss << "limitfps=" << (settings.getLimitFramerate() ? "1" : "0") << std::endl;
  ss << "fps=" << settings.getFramerateLimit();
  // etc...

  // Encrypt
  original = ss.str();
  for (std::size_t temp = 0; temp < original.size(); ++temp) 
    encrypted += original[temp] ^ (static_cast<int>(key) + temp) % 255;
  

  // Print and write to file
  std::cout << "Saving encrypted data to file:\n" << encrypted << std::endl;
  file << encrypted;
  file.close();

一切正常,但我的电脑由于某种原因发出 3 声哔哔声。如何让它不发出哔哔声?

既然它在代码中,另一个问题:我不需要最后的file.close(),对吧?我读到close() 会在到达范围末尾时自动调用?

谢谢

【问题讨论】:

关于第二个问题:是的,你是对的,当应用程序离开一个范围时,所有变量的析构函数(带有析构函数)被调用,并在你的情况下关闭文件。这包括抛出的异常(这就是为什么可以(并且正在)使用互斥锁的原因),但不包括崩溃、终止(包括线程的终止)和其他强制关闭应用程序的技术。就像关机一样。 【参考方案1】:

encrypted 将包含不可打印的字符,因此当您将它们打印到控制台时,您会收到一些垃圾发送到控制台。

其中一些垃圾显然是 ASCII 码 0x07/^G/BEL,这会导致控制台发出哔哔声。

要解决此问题,请不要打印encrypted,或者以过滤掉不可打印字符或格式化为十六进制或其他内容的方式打印它。

【讨论】:

【参考方案2】:

我猜你通过管道传输到标准输出的加密字符串包含三倍的字符 0x07,别名“Bell”。

【讨论】:

以上是关于异或加密字符串并将其保存在文本文件中时,PC 会发出哔哔声的主要内容,如果未能解决你的问题,请参考以下文章

C#:需要帮助加密 app.config 中的连接字符串并将其保存在那里并解密并使用?

比较两个文本文件 - 并将差异保存到新文件

在vba excel中保存大量字符串

点击保存按钮并存储在字典中时获取表格视图单元格中的文本字段?

是否可以将 16 位二进制数转换为两个字符并将其保存到文本文件中?

我们如何逐行打印字符并将其保存到 PLSQL 中的 csv 或文本文件