ruby - 如何通过键值增加ascii ord
问题描述
我想通过键值递增 ASCII 来加密字符串。但是使用这段代码我遇到了问题。
def caesar_cipher(str, key)
new_sentence = []
str.split("").each do |letter|
ascii = letter.ord
puts ascii
ascii += key if ascii >= 65 && ascii <= 90
if ascii > 90
return_start = ascii - 90
ascii = 64 + return_start
end
ascii += key if ascii >= 97 && ascii <= 122
if ascii > 122
return_start = ascii - 122
ascii = 96 + return_start
end
puts ascii
new_sentence << ascii.chr
end
puts new_sentence
end
caesar_cipher("Wh", 5)
我放了一些puts
看看会发生什么,当我puts ascii
看到那不会给我返回好数字时。对于'W',一切都很好。他开始87
和去66
。但我不明白为什么'h'有问题。他开始104
和去78
。他为什么不去109
?
解决方案
简短的回答:因为你告诉它。
if ascii > 90 # "h".ord == 104 so this is true
return_start = ascii - 90 # return_start is now 14
ascii = 64 + return_start # ascii is now 64 + 14 (78)
# Note this is a elaborate way of subtracting 26 from ascii
end
像这样编码时,尝试使用以下方法打印中间值和结果p
:
if ascii > 90
p return_start = ascii - 90
p ascii = 64 + return_start
end
推荐阅读
- python - Django inlineformset_factory 和 ManyToManyField 字段,再一次
- user-interface - 更改 VS Code 上的默认新编辑器组位置
- office-js - Outlook Online - 对话框问题
- javascript - Javascript时间计算器更正
- python - 将 CSV 文件的特定列提取到 python 数组中
- jenkins - 发送电子邮件警告时遇到问题(Jenkins 电子邮件扩展插件 + 警告 ng 插件)
- c# - c#如何从内存地址中获取值并将其转换为主要类型?
- c# - PrincipalContext(ContextType.Domain) 仅适用于域管理员
- flutter - Flutter:当我调用 Stateful Widget 时没有 SuchMethodError
- django - 迁移时 Django 3 multi-base 不工作