Hello,
Is there a ruby function to convert the following hexadecimal numbers
into the corresponding signed integers or will i need to write something
to do the conversion? Sorry if this question is stupid but i’m pretty
new to all this.
0xFF467A7B => -12158341
0x38CFEF => 3723247
Thanks
On Jan 9, 2008, at 2:48 PM, Tim C. wrote:
Hello,
Is there a ruby function to convert the following hexadecimal numbers
into the corresponding signed integers or will i need to write
something
to do the conversion? Sorry if this question is stupid but i’m pretty
new to all this.
0xFF467A7B => -12158341
0x38CFEF => 3723247
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 W.
Gary W. 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 W.
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?
Tim C. wrote:
Gary W.
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 Two's complement - Wikipedia.
Thanks a lot, that works a treat.
Ken B. wrote:
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 Two's complement - Wikipedia.
Why go through all the trouble to make this a proc?
Cut and paste from some code that was using #define_method with this
proc, and thereby saved performing the exponentiations on each call.
That’s all.
On Thu, 10 Jan 2008 13:19:46 -0500, Joel VanderWerf wrote:
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 Two's complement - Wikipedia.
Why go through all the trouble to make this a proc?
–Ken