2012-04-01 7 views
5

16進数の文字列を32ビット符号付き整数に変換するにはどうすればよいですか?例えば は16進数の文字列をRubyで符号付き整数に変換する

a = "fb6d8cf1" #hex string 
[a].pack('H*').unpack('l') #from the documentation it unpacks to its 32 bit signed int 

それは

-242455045 

に変換しかし、実際の答えは

-76706575 

あなたは私が間違っているのものに私を指すもらえますか?

答えて

3

あなた自身がエンディアンを回避するためにバイトを反転し、問題に署名できます:

>> ['fb6d8cf1'.scan(/[0-9a-f]{2}/i).reverse.join].pack('H*').unpack('l') 
=> [-76706575] 
0

用途:あなたはエンディアン問題を抱えていたよう

class String 
    def to_si(base, lenght = 32) 
    mid = 2**(length-1) 
    max_unsigned = 2**length 
    n = self.to_i base 
    (n>=mid) ? n - max_unsigned : n 
    end 
end 

"fb6d8cf1".to_si 16, 32 
+0

コードが負の数のために働くこれは、所望の結果を提供します。ありがとう。しかし、正の数値では失敗します。たとえば、 "038a67f90"は950435728と表示されますが、実際の値は59402233 –

3

思えます。

[a].pack("H*").unpack("l>") 
# => [-76706575] 
["038a67f90"].pack("H*").unpack("l>") 
#=> [59402233] 
+0

です。なぜなら、l>を使った後でさえまだ-242455045 –

+0

ruby​​ 1.9.3p125(2012-02-16 revision 34643)[x86_64-darwin11.3.0] –

+0

というドキュメントが得られているからです。残念ながら、私はプロダクションサーバー上でRubyをアップグレードすることはできません。このための回避策を見つける必要があります –

関連する問題