如何在Ruby中对字符串的每个字符进行XOR操作?
在Ruby中对字符串每个字符进行XOR操作的实现方法
嘿,我明白你在Ruby里实现字符串字符XOR时遇到的困扰了!其实思路和C++是相通的,只是Ruby的字符串处理方式略有不同,下面我给你详细讲怎么实现:
基础单密钥字符XOR
如果你的密钥是单个字符,我们可以直接遍历字符串的每个字符,将其转换为ASCII码后与密钥的ASCII码做异或操作,再转回字符即可。这里有个简单的实现方法:
def xor_single_key(str, key_char) # 把字符串拆成单个字符数组,逐个处理后再拼接回去 str.chars.map do |char| # char.ord 获取字符的ASCII数值,和密钥的ASCII值异或后转回字符 (char.ord ^ key_char.ord).chr end.join end
使用示例
# 原始字符串 original = "Hello Ruby XOR Test" # 用单个字符作为密钥 key = "A" # 加密 encrypted = xor_single_key(original, key) puts "加密后:#{encrypted}" # 解密(XOR是可逆操作,用同样的方法即可) decrypted = xor_single_key(encrypted, key) puts "解密后:#{decrypted}" # 会输出原始字符串
多字符密钥的XOR实现
如果你的密钥是一个多字符的字符串(比如类似Vigenère密码的循环密钥),我们可以调整方法,让密钥循环作用在每个字符上:
def xor_multi_key(str, key_str) key_chars = key_str.chars str.chars.each_with_index.map do |char, idx| # 循环取密钥的字符,通过取余实现循环 current_key_char = key_chars[idx % key_chars.length] (char.ord ^ current_key_char.ord).chr end.join end
使用示例
original = "My secret message" key = "SecretKey" encrypted = xor_multi_key(original, key) puts "多密钥加密后:#{encrypted}" decrypted = xor_multi_key(encrypted, key) puts "多密钥解密后:#{decrypted}" # 输出原始字符串
和C++实现的对比
其实Ruby的实现逻辑和C是一致的:都是遍历字符串的每个字节(字符),与密钥的对应字节做异或操作。区别在于C中char本身可以直接作为数值参与运算,而Ruby中需要用ord方法将字符转换为ASCII数值,操作完成后再用chr转回字符。
内容的提问来源于stack exchange,提问作者XIN LIU
相关产品推荐
相关产品推荐

