From: Joel VanderWerf Date: 2008-01-11T03:19:46+09:00 Subject: Re: Question about Hex => Signed Int Tim Conner wrote: > Gary Wright wrote: >> The tricky part is dealing with the twos compliment notation but >> String#to_i will do the hex/decimal conversion: >> >> >> "0xFF467A7B".to_i(16) - 0x100000000 >> => -12158341 >> >> >> "0x38CFEF".to_i(16) >> => 3723247 >> >> Gary Wright > > Thanks for that. Is there a ruby function which I can pass a hex number > and it works out if it is +/- and then returns the correct decimal > value? Convert to unsigned first, like above, then do something like this: length = 32 # in bits; you have to choose this mid = 2**(length-1) max_unsigned = 2**length to_signed = proc {|n| (n>=mid) ? n - max_unsigned : n} p to_signed["0xFF467A7B".to_i(16)] p to_signed["0x38CFEF".to_i(16)] See http://en.wikipedia.org/wiki/Twos_complement. -- vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407