任意の長さのバイナリ文字列の数値表現が必要です。このように見えないほど簡単な作業は、意外にも複雑であることが判明しました。私はこれまで思い付くことができる最高はruby:Bignumとしてのバイナリ文字列を表す
string.unpack('H*')[0].to_i(16)
ですが、アンパックが最高ニブルで先行ゼロを返す可能性があるため、この操作は、可逆性を欠い:私が得た場合今、私がチェックする必要があり
['ABC'].pack('H*') == ['0ABC'].pack('H*') # false
を整数からの変換後の偶数のニブル、必要に応じて0のパッドなどがあります。それはすべて良いことですが、私はちょうどこれが複雑でなければならないと信じられません。例と
更新:
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
just:string.to_i(16)の何が問題なのですか? – pguardiario
string.to_(16)は、任意のビット列ではなく、16進数の文字列を変換します。 – punund