2011-11-22 86 views
1

我只是試圖翻轉一個字符的位。我可以把它變成一個二進制形式,但是當用0xff將這些數據進行xoring時,它似乎不會給我我想要的。紅寶石:翻轉字符位

bin = "a".unpack("b*")[0].to_i # Will give me the binary value  (10000110) 
flip = bin^0xff    # this will give me 9999889, expecting (01111001) 

最後,我想重新打包爲一個「人物」 ......

任何幫助,將不勝感激。

回答

5

你需要告訴紅寶石是解壓的字符串是二進制的:

bin = "a".unpack("b*")[0].to_i(2) # => 134 
flip = bin^0xff # => 121 
flip.to_s(2) # => "1111001" 
[flip.to_s(2)].pack("b*") # => "O" 
2

幾件事情:

你可能想unpack('B*'),不b*b*給你LSB第一。

你可能根本不需要二進制(「二進制」只是一個數字的表示,它不需要是「二進制數」來異或)。因此,你可以簡單地做:

number = "a".unpack('C*')[0] 
flip = number^0xff 
new_number = [flip].pack('C*') 

,或者甚至是:

number = "a".ord 
flip = number^0xff 
new_number = flip.chr 

哦,結果不應該是「O」

+0

第二個例子似乎沒有在1.9的工作,但第一個更容易理解 – wuntee

+0

您試過的版本是哪個版本?在這裏1.9.1和1.9.2工作。另外:http://ideone.com/y74Ov –