Hi
I’ m using unpack to convert 4 bytes to local integer, but ruby just
supply the “N” modifer which means unsigned long integer.
My questions is :
How to unpack 4 bytes to a signed integer ?
Thank you.
Hi
I’ m using unpack to convert 4 bytes to local integer, but ruby just
supply the “N” modifer which means unsigned long integer.
My questions is :
How to unpack 4 bytes to a signed integer ?
Thank you.
s = 0xFF.chr * 4
i = s.unpack(“L”).shift
p i
p 2**32-1
w wg wrote:
Hi
I’ m using unpack to convert 4 bytes to local integer, but ruby just
supply the “N” modifer which means unsigned long integer.My questions is :
How to unpack 4 bytes to a signed integer ?
The best way I’ve found is to unpack with N (to get the swapping right)
and then do some arithmetic to interpret the unsigned value as signed:
x = -123
s = [x].pack(“N”)
p s # ==> “\377\377\377\205”
length = 32
mid = 2**(length-1)
max_unsigned = 2**length
to_signed = proc {|n| (n>=mid) ? n - max_unsigned : n}
p to_signed[s.unpack(“N”).first] # ==> -123
This is all very hard for me to remember, so I’ve written a library to
do it, bit-struct (BitStruct). This
makes life easier:
require ‘bit-struct’
class Packet < BitStruct
signed :x, 32
end
pkt = Packet.new
pkt.x = -123
p pkt.to_s # ==> “\377\377\377\205”
p pkt.x # ==> -123
pkt2 = Packet.new(“\377\377\377\205”)
p pkt2.x # ==> -123
But the “i” and “I” modifer don’t care bytes order.
I’m reading data from network using IO#sysread, I need receive integer
, not unsigned integer.
Thank you for your reply.
2007/1/15, Mike S. [email protected]:
s = 0xFF.chr * 4
i = s.unpack(“L”).shift
p i
p 2**32-1
On 15-Jan-07, at 10:10 AM, w wg wrote:
But the “i” and “I” modifer don’t care bytes order.
I’m reading data from network using IO#sysread, I need receive integer
, not unsigned integer.Thank you for your reply.
OK then, what about “V”? “treat 4 characters as an unsigned long in
little-endian byte order”
The N uses network byte order “big-endian”
Mike
My questions is :
––
WenGe Wang
–
Mike S. [email protected]
http://www.stok.ca/~mike/
The “`Stok’ disclaimers” apply.
On 15-Jan-07, at 8:29 AM, w wg wrote:
Hi
I’ m using unpack to convert 4 bytes to local integer, but ruby just
supply the “N” modifer which means unsigned long integer.My questions is :
How to unpack 4 bytes to a signed integer ?
There are “i” and “I” for signed and unsigned integer respectively,
which deals in the local size of integer.
Hope this helps,
Mike
–
Mike S. [email protected]
http://www.stok.ca/~mike/
The “`Stok’ disclaimers” apply.
I tried your codes, it works exactly as what I expected. I havn’t
tried your library, but I think it should get the correct result too.
Thank you.
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.
Sponsor our Newsletter | Privacy Policy | Terms of Service | Remote Ruby Jobs