2011-12-20 4 views
1

J'ai ruby ​​1.9.2dev (2010-07-02) [i486-linux].Ruby ne reconnaît pas l'opérateur "^ ="

Je sais que le ^= est un opérateur ixor comme indiqué dans la documentation officielle.

Ceci est la sortie lorsque j'exécute le script à partir du shell.

[email protected]:~/Desktop/cha03# ./cha03 
./cha03:35:in `block in <main>': undefined method `^' for "\x1C":String (NoMethodError) 
    from ./cha03:35:in `each_byte' 
    from ./cha03:35:in `each_with_index' 
    from ./cha03:35:in `<main>' 

Et c'est la ligne qui fait l'erreur:

key.each_byte.each_with_index { |b,i| key[i] ^= subkey[i % 4] } 
+0

remercie tous pour les conseils –

+0

Pouvez-vous ajouter un exemple de définition de 'key' et' subkey' qui présente le problème? Je soupçonne fortement «clé» de ne pas être une chaîne. – phihag

Répondre

2

En ruby ​​1.9 string[some_index] n'est plus la valeur d'octet, il sera plutôt une chaîne

ruby-1.9.2-p180 :001 > '123'[2] => "3" 

cordes ne marche pas avoir une méthode ^, donc vous obtenez l'erreur que vous avez décrite. Dans ruby ​​1.8.7, vous auriez la valeur de l'octet à la place et tout aurait fonctionné. Je pense que vous aurez plus de chance à l'aide Déballez pour transformer la chaîne en un tableau d'octets, manipuler qui a mis ensuite tout retour ensemble, quelque chose le long des lignes de

1

extension classe String pour pouvoir facilement xor -ed avec une autre chaîne ou un nombre
exemple d'utilisation:

#irb -E binary 
ruby-1.9.3-p0 :021 > "foo".xor('bar') 
=> "\x04\x0E\x1D" 
ruby-1.9.3-p0 :022 > "foo".xor(1) 
=> "gnn" 

class String 
    def xor x 
    if x.is_a?(String) 
     r = '' 
     j = 0 
     0.upto(self.size-1) do |i| 
     r << (self[i].ord^x[j].ord).chr 
     j+=1 
     j=0 if j>= x.size 
     end 
     r 
    else 
     r = '' 
     0.upto(self.size-1) do |i| 
     r << (self[i].ord^x).chr 
     end 
     r 
    end 
    end 
end