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
換句話說,我們沒有要解碼,我們開始使用相同的值。
給出樣本輸入和預期輸出。只有您編寫的代碼,您的文章不夠具有描述性。 – texasbruce 2012-04-15 01:28:35
just:string.to_i(16)有什麼問題? – pguardiario 2012-04-15 06:21:42
string.to_(16)轉換一串十六進制數字,而不是一串任意的位。 – punund 2012-04-15 07:58:39