2011-12-12 48 views
1

這可能是一個簡單的問題,但我試圖回顧編碼和字節(我沒有看過一會兒)來實現二進制協議。編碼的十六進制字符串中的字節數

看起來正常字符是1個字節。但是,當你用十六進制編碼它們時,它將字節數減半。

ruby-1.9.2-p180 :001 > "abcd".bytesize 
=> 4 
ruby-1.9.2-p180 :002 > ["abcd"].pack("H*") 
=> "\xAB\xCD" 
ruby-1.9.2-p180 :003 > ["abcd"].pack("H*").bytesize 
=> 2 

我也期待十六進制編碼來與0-9和A-F

有人能幫助澄清這到底是怎麼回事呢?而且,如果你能指出我對一般在線編碼的好的評論,我很樂意提一提。我還沒有看到任何簡單的概述,但這會很棒。

謝謝!

+0

看來你確實解碼而不是編碼以十六進制爲'十六進制abcd'(四個字節)是'171,205'(二字節)十進制。 –

+0

你想做什麼?用十六進制表示每個字符的代碼點? – deceze

+0

一個字符是一個字節。一個十六進制數字[0-9A-F]是一個低位或半個字節。例如,'FF'十六進制是一個字節的最大值。因此,你的發現是預料之中的:一個4字符的字符串是4個字節,而'ABCD'十六進制是兩個字節,'AB'和'CD'。 –

回答

3

#pack讀取給定的字符串並根據給定的格式將其轉換爲二進制。 pack('H*')表示您給出的字符串表示十六進制符號,因此它會將字節ABCD從十六進制轉換爲二進制(1010 1011 1100 1101),這是兩個字節。

嘗試["g"].pack("H*"),其中g不是有效的十六進制字符...

+0

我想我現在看到我的困惑 - 「abcd」實際上是一個十六進制字符串,它將轉換爲二進制。我以爲我正在採取一個正常的字符串,並將其轉換爲十六進制。 :/ 謝謝您的幫助! –

相關問題