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

Ruby加密算法解密时出现ZeroDivisionError问题求助

解决Ruby解密算法中的ZeroDivisionError问题

嘿,我看你在写Ruby加密算法的时候,加密正常但解密卡在了第67行的ZeroDivisionError(除以零)上,这确实挺头疼的。结合你给的代码片段,我来帮你捋捋可能的问题和解决思路:

核心问题定位

这个错误说明在第67行的除法操作里,除数变成了0。从你处理对称密钥的代码来看,问题大概率出在密钥转换后的数值有效性上。

可能的原因及修复方案

  • 密钥转换覆盖不全:你现在只把a/b/c替换成了1/2/3,但如果用户输入的密钥里有其他字符(比如d到z、符号、空格),这些字符没被替换,后续转成数值的时候可能会变成0或者空值,直接导致除法失败。
    推荐你换个更全面的转换方式,比如用字母的ASCII码来映射:

    # 把每个字母转成1-26的数字(不区分大小写)
    symetricKey = symetricKey.chars.map do |c|
      c.downcase.ord - 96 # 'a'的ASCII是97,减完就是1,以此类推
    end.join
    

    这样不管输入哪个字母,都能得到有效的非零数字,避免出现0值。

  • 解密逻辑未做除数校验:假设第67行的代码是类似result = some_value / key_digit的写法,如果key_digit是0,肯定会炸。你可以在除法前加个校验:

    divisor = key_part.to_i
    if divisor == 0
      puts "密钥里包含无效字符,请检查输入!"
      exit # 或者做其他错误处理
    end
    result = some_value / divisor
    
  • 输入未做有效性校验:如果用户输入的密钥是空的,或者全是没被替换的字符(比如xyz),转换后可能变成空字符串,转成整数就是0。所以在处理密钥前先加个检查:

    print "> "
    symetricKey = gets.chomp.strip
    if symetricKey.empty?
      puts "密钥不能为空哦!"
      exit
    end
    # 转换后检查是否还有非数字字符
    symetricKey.gsub!('a', '1').gsub!('b', '2').gsub!('c', '3')
    if symetricKey.match?(/\D/)
      puts "密钥只能包含a、b、c或者数字1、2、3哦!"
      exit
    end
    

小提示

如果能把第67行的具体代码贴出来,就能更精准地定位问题啦!不过从目前的信息来看,核心就是除数变成了0,从密钥转换和输入校验这两块入手,应该能搞定这个问题。

内容的提问来源于stack exchange,提问作者huw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:20:46