C#中char.GetNumericValue返回-1问题及隐藏密钥查找代码求助
解决char.GetNumericValue返回-1的问题
我看到你在编写提取文本隐藏密钥的C#代码时遇到了char.GetNumericValue返回-1的问题,这个坑我之前也踩过,咱们来一步步搞定它。
首先得搞明白char.GetNumericValue到底是干嘛的:它的作用是解析字符所代表的数字值,而不是获取字符本身的ASCII/Unicode编码值。举几个例子你就懂了:
- 传入
'5',它返回5.0(转成int就是咱们要的5) - 传入
'A'、'!'这类不代表数字的字符,它就返回-1.0 - 甚至传入
'½',它会返回0.5——因为这是这个字符代表的数字
所以你遇到返回-1的情况,说明你从文本中提取的chr不是一个有效的数字字符,或者你其实搞错了要获取的值(比如你实际想拿字符的编码值,而不是它代表的数字)。
下面给你两种针对性的解决方案:
方案1:确保只处理数字字符,添加校验
如果你确定密钥部分应该是0-9的数字字符,那可以先校验字符是否合法,再转换,同时处理异常情况:
private static string FindKey(string text) { // 先修正密钥长度的获取:如果第一个字符是数字字符,才转成对应的长度 if (!char.IsDigit(text[0])) { throw new InvalidOperationException("文本第一个字符不是有效的密钥长度数字"); } int keyLength = Convert.ToInt32(char.GetNumericValue(text[0])); int[] keySliced = new int[keyLength]; char[] fullText = text.ToCharArray(); char[] chars = new char[text.Length - (1 + keyLength)]; Console.WriteLine("Key Length -> {0}", keyLength); int y = 0; for(int i = 1 + chars.Length; i < 1 + chars.Length + keyLength; i++) { char chr = fullText[i]; // 先判断是否是数字字符 if (char.IsDigit(chr)) { keySliced[y] = Convert.ToInt32(char.GetNumericValue(chr)); Console.WriteLine("提取的密钥数字: {0}", keySliced[y]); } else { // 这里可以根据需求调整:抛出异常、记录日志或者跳过无效字符 throw new InvalidOperationException($"在位置{i}发现非数字字符'{chr}',无法提取密钥"); // 如果允许跳过无效字符,就用下面这行代替throw // continue; } y++; } // 后续处理逻辑... return ""; // 根据你的实际逻辑返回结果 }
方案2:获取字符的编码值(如果这是你的真实需求)
如果你其实是想获取字符的ASCII/Unicode编码值(比如把字符'A'转成65),那完全不需要用char.GetNumericValue,直接强制类型转换就行:
private static string FindKey(string text) { // 同样注意密钥长度的获取,如果第一个字符是代表长度的数字,要正确转换 if (!char.IsDigit(text[0])) { throw new InvalidOperationException("文本第一个字符不是有效的密钥长度数字"); } int keyLength = Convert.ToInt32(char.GetNumericValue(text[0])); int[] keySliced = new int[keyLength]; char[] fullText = text.ToCharArray(); char[] chars = new char[text.Length - (1 + keyLength)]; Console.WriteLine("Key Length -> {0}", keyLength); int y = 0; for(int i = 1 + chars.Length; i < 1 + chars.Length + keyLength; i++) { char chr = fullText[i]; // 直接转成int获取字符的编码值 keySliced[y] = (int)chr; Console.WriteLine("提取的密钥值: {0}", keySliced[y]); y++; } // 后续处理逻辑... return ""; // 根据你的实际逻辑返回结果 }
另外提个小细节:你原来的keyLength = text[0];会把第一个字符的编码值赋值给keyLength(比如第一个字符是'3',那得到的是51而不是3),这大概率不是你想要的,所以上面的代码里已经修正了这个问题。
内容的提问来源于stack exchange,提问作者Szymczok
相关产品推荐
相关产品推荐

