2012-04-15 1 views
2

任意の長さのバイナリ文字列の数値表現が必要です。このように見えないほど簡単な作業は、意外にも複雑であることが判明しました。私はこれまで思い付くことができる最高は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 

、我々は我々が開始したのと同じ値にデコードすることができませんでした。

+0

サンプル入力と期待される出力を与えます。あなたの投稿はあなたが書いたコードだけでは説明力が足りません。 – texasbruce

+0

just:string.to_i(16)の何が問題なのですか? – pguardiario

+0

string.to_(16)は、任意のビット列ではなく、16進数の文字列を変換します。 – punund

答えて

0

残念ながら、私は

は.to_s(16)であってもよい... Rubyでゼロ知識を持っている、しかし、あなたがチェックできるアイデアを持っている方法は、異なるデフォルトエンコーディングを持つ文字列に変換したときに、これは重要かもしれ.pack( 'H *')の後に文字列比較を行いますか?これは動作するでしょう: [s.unpack( 'H *')[0] .to_i(16).to_s(16)] pack( 'H *')force_encoding 'バイナリ' == s

それ以外の場合は、先行ゼロを持つニブルが同じ文字列バイトと異なる文字列バイトにどのように変換できるのか想像するのは難しいですが、ゼロを持たない六角ニブルから変換されます。

関連する問題