2013-05-30 114 views
-1

我正在使用Ruby進行一個項目。我正在使用的庫以雙引號返回一個字符串,例如:"\x00\x40"。由於字符串使用雙引號,因此可以轉換爲ASCII字符的任何十六進制都將被轉換。因此,當我打印時,我實際上看到:"\[email protected]"將雙引號改爲單引號

我想通了,如果我使用單引號,那麼字符串將打印在純十六進制(沒有轉換),這是我想要的。如何將雙引號字符串更改爲單引號?

我沒有任何方法來改變庫中的返回類型,因爲它是一個C擴展名,我不知道從哪裏返回值。任何想法不勝感激。

+3

這適用字符串** litterals **,意思是在您的源代碼中找到的字符串。一旦被紅寶石引擎解析,所有的字符串都是平等的,因此你的問題似乎很奇怪。如果你想返回轉義序列,你也可以在雙引號字符串中避開反斜線。 – SirDarius

+0

轉義反斜槓的作品,但我看不出有任何辦法與返回的數據做到這一點。 –

+1

好吧,請改善你的問題,因爲現在它不夠精確,無法清楚地理解。一些代碼也可能有幫助。 – SirDarius

回答

4

"\x00\x40"'\x00\x40'產生完全不同的字符串。

"\x00\x40"創建一個2字節的字符串,十六進制值0x000x40

"\x00\x40".length 
# => 2 

"\x00\x40".chars.to_a 
# => ["\u0000", "@"] 

'\x00\x40'創建了8個字符的字符串:

'\x00\x40'.length 
# => 8 

'\x00\x40'.chars.to_a 
# => ["\\", "x", "0", "0", "\\", "x", "4", "0"] 

這是Ruby的語法分析器做,你不能改變它一旦創建了字符串。

但是,你可以將轉換成這個字符串來獲得它的十六進制表示。

String#unpack字符串作爲一個十六進制字符串進行解碼,即,其返回每個字節作爲一個字符串的十六進制值:

hex = "\x00\x40".unpack("H*")[0] 
# => "0040" 

String#gsub添加/插入\x每2個字節:

hex.gsub(/../) { |s| '\x' + s } 
# => "\\x00\\x40" 
+0

非常感謝,謝謝:) –

+0

優秀的答案!我的問題是 - 你在這裏如何實現? :)真的很自豪。直到我看到這個答案,我纔想到這樣的區別。 –