You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:51:58