任意の長さのバイナリ文字列の数値表現が必要です。この一見些細な作業は、予想外に複雑であることが判明しました。これまでのところ私が思いつくことができる最高のものは
string.unpack('H*')[0].to_i(16)
ただし、この操作には可逆性がありません。これは、unpack が最上位のニブルで先行ゼロを返す可能性があるためです。
['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
つまり、最初と同じ値にデコードできませんでした。