【问题标题】:Converting integers to ASCII results in beeping and illegible text?将整数转换为 ASCII 会导致哔哔声和难以辨认的文本?
【发布时间】:2013-05-01 21:14:18
【问题描述】:

我从来没有在控制台应用程序中遇到过这样的问题 - 我听到一些相当可怕的哔哔声,程序(和我的计算机)暂时冻结,然后控制台停止工作 - 它甚至不打印错误消息。

我有this text file。我阅读如下,然后将数字拆分为一个列表:

string path = @"C:\Users\owner\Documents\Quick Access\cipher1.txt";
string data = "";
using (StreamReader sr = new StreamReader(path))
{
    data = sr.ReadToEnd();
}

List<int> encryptedNums = new List<int>();
foreach (string s in data.Split(','))
{
    encryptedNums.Add(Convert.ToInt32(s));
}

每个数字代表一个 ASCII 字符。我想将这些数字连接成一个字符串:

string encryptedString = "";

//WTF???? 
foreach (int n in encryptedNums)
{
    encryptedString += (char)n;
}

foreach 循环会导致一些非常奇怪的转换。通过逐个打印出字符并将它们与ASCII table 进行比较,我发现结果肯定是 匹配的——例如,数字 2 会生成一个笑脸类型的图形。其中一种转换会产生哔哔声。

这才是真正困扰我的地方。我有一个单独的方法,我基本上做同样的事情 - 我有一个整数列表,我尝试将它们转换为字符串:

string s = "";
foreach (int n in decrypted)
{
    s += (char)n;
}

但这实际上会产生一个正确的字符串!我看不到我的错误在哪里,为什么第一次转换失败,而第二次转换(除非我遗漏了什么,代码是一样的)很好。

我将不胜感激。

最终导致崩溃的代码是打印encryptedString

Here is the full code.

【问题讨论】:

  • 我打赌你想要n.ToString() 而不是(char)n
  • @AustinSalonen 不,这会给我一个数字的字符串表示形式。我需要相应的 ASCII 字符。
  • 不胜感激的解释。问题的内容可能是具体的和本地化的,但问题本身(我相信)是通用的。

标签: c# type-conversion character ascii


【解决方案1】:

第二个有效而第一个无效的原因是n 的值不同。

可见字母将在 32 到 126 的范围内(对于 \t\n\r,分别为 9、10 和 13),如果您没有得到该范围内的整数,那么您正在执行“解密”不正确(从您的代码示例中,您根本没有进行任何解密)。

您必须对文本文件中的 int 列表进行一些操作以使其成为易读的文本。

【讨论】:

  • 该文件包含超出该范围的数字。
  • @NoToast 应该是,他正在尝试完成Project Euler Problem 59。目标是找出 3 个字母的键,使上述键仅具有可读文本的值。
  • 你说得对,我的逻辑有缺陷,我试图打印我们的字符串,该字符串并非设计为可打印/可读。
  • @ScottChamberlain 啊,我明白了。我不熟悉那个问题。
  • 我解决它的方法是为密钥中的每个字节创建一个HashSet。然后我将遍历密文,从我正在测试的字节的HashSet 中删除所有值,这会导致我正在异或的字母成为非法字符。在该过程结束时,我要么在每个 HashSet 中拥有 1 个值,要么只尝试少数几个值,我可以自己检查它们,看看哪些是乱码,哪些是有意义的。
【解决方案2】:

你的问题是铃铛字符或'\7'

http://en.wikipedia.org/wiki/Bell_character

打印该字符通常会导致蜂鸣声,并且在短时间内多次这样做会导致应用程序在大多数系统上冻结。

【讨论】:

  • 不要告诉别人should use a shoe or glass bottle,告诉他们拿锤子!
  • 我同意,但钟字符仍然是一件很酷的事情,我的回答是有效的。我觉得投反对票是不合理的。
  • 反对票被描述为“这个答案没有用” 解释钟形字符虽然很有趣,但对于解决 OP 的 why 问题没有用处b> 他的文字难以辨认。
  • 作为记录,我同意。我接受了 Scott 的回答,因为它帮助我解决了我眼前的问题(哔哔声是一个附带问题),但 NoToast 的回答非常有帮助,与问题相关,并且提高了我的一般知识。. 否决票绝对是不合理的。
  • @ScottChamberlain 你错了——他提供的信息和链接确实帮助我理解了。他没有用婴儿喂养我的答案,但他给了我资源让我找到答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-11
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
相关资源
最近更新 更多