2012-04-15 21 views
2

我需要有任意長度的二進制字符串的數字表示形式。這個看似微不足道的任務意外地變得很複雜。我能想出迄今最好的是ruby​​:將二進制字符串表示爲Bignum

string.unpack('H*')[0].to_i(16) 

但這種操作缺乏可逆性,因爲解包可能返回的最高四位前導零:

['ABC'].pack('H*') == ['0ABC'].pack('H*') # false 

現在,我需要檢查,如果我有即使是從整數轉換後的半字節數,如果需要填充零等。這一切都很好,清楚,但我不能相信這一定是如此錯綜複雜。

更新與例如:

s = "\x01\x1D\x9A".force_encoding 'binary' # "\x01\x1D\x9A" 
s.unpack('H*') # ["011d9a"] 
s.unpack('H*')[0].to_i(16) # 73114 

現在讓我們來解碼:

s.unpack('H*')[0].to_i(16).to_s(16) # "11d9a" — notice that leading zero is gone 
[s.unpack('H*')[0].to_i(16).to_s(16)].pack('H*') # "\x11\xD9\xA0" 
[s.unpack('H*')[0].to_i(16).to_s(16)].pack('H*') == s # false, obviously 

換句話說,我們沒有要解碼,我們開始使用相同的值。

+0

給出樣本輸入和預期輸出。只有您編寫的代碼,您的文章不夠具有描述性。 – texasbruce 2012-04-15 01:28:35

+0

just:string.to_i(16)有什麼問題? – pguardiario 2012-04-15 06:21:42

+0

string.to_(16)轉換一串十六進制數字,而不是一串任意的位。 – punund 2012-04-15 07:58:39

回答

0

不幸的是,我在紅寶石零知識,但有一個想法,你可以檢查...

可能.to_s(16)方法將其轉換爲具有不同的默認編碼,可這事宜時,串你在.pack('H *')之後進行字符串比較? ('H *')[0] .to_i(16).to_s(16)]。pack('H *')。force_encoding'binary'== s

(可能是這樣) 可能會工作: [s.unpack

否則很難想象前導零的半字節如何轉換爲字符串字節,該字符串字節與相同的字符串字節不同,但是從十六進制的半字節轉換爲零。

相關問題