我正在使用Ruby進行一個項目。我正在使用的庫以雙引號返回一個字符串,例如:"\x00\x40"
。由於字符串使用雙引號,因此可以轉換爲ASCII字符的任何十六進制都將被轉換。因此,當我打印時,我實際上看到:"\[email protected]"
。將雙引號改爲單引號
我想通了,如果我使用單引號,那麼字符串將打印在純十六進制(沒有轉換),這是我想要的。如何將雙引號字符串更改爲單引號?
我沒有任何方法來改變庫中的返回類型,因爲它是一個C擴展名,我不知道從哪裏返回值。任何想法不勝感激。
我正在使用Ruby進行一個項目。我正在使用的庫以雙引號返回一個字符串,例如:"\x00\x40"
。由於字符串使用雙引號,因此可以轉換爲ASCII字符的任何十六進制都將被轉換。因此,當我打印時,我實際上看到:"\[email protected]"
。將雙引號改爲單引號
我想通了,如果我使用單引號,那麼字符串將打印在純十六進制(沒有轉換),這是我想要的。如何將雙引號字符串更改爲單引號?
我沒有任何方法來改變庫中的返回類型,因爲它是一個C擴展名,我不知道從哪裏返回值。任何想法不勝感激。
"\x00\x40"
和'\x00\x40'
產生完全不同的字符串。
"\x00\x40"
創建一個2字節的字符串,十六進制值0x00
和0x40
:
"\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"
非常感謝,謝謝:) –
優秀的答案!我的問題是 - 你在這裏如何實現? :)真的很自豪。直到我看到這個答案,我纔想到這樣的區別。 –
這適用字符串** litterals **,意思是在您的源代碼中找到的字符串。一旦被紅寶石引擎解析,所有的字符串都是平等的,因此你的問題似乎很奇怪。如果你想返回轉義序列,你也可以在雙引號字符串中避開反斜線。 – SirDarius
轉義反斜槓的作品,但我看不出有任何辦法與返回的數據做到這一點。 –
好吧,請改善你的問題,因爲現在它不夠精確,無法清楚地理解。一些代碼也可能有幫助。 – SirDarius