94 lines
2.2 KiB
Ruby
94 lines
2.2 KiB
Ruby
|
|
module RocketAMF
|
||
|
|
module Pure
|
||
|
|
module ReadIOHelpers #:nodoc:
|
||
|
|
def read_int8 source
|
||
|
|
source.read(1).unpack('c').first
|
||
|
|
end
|
||
|
|
|
||
|
|
def read_word8 source
|
||
|
|
source.read(1).unpack('C').first
|
||
|
|
end
|
||
|
|
|
||
|
|
def read_double source
|
||
|
|
source.read(8).unpack('G').first
|
||
|
|
end
|
||
|
|
|
||
|
|
def read_word16_network source
|
||
|
|
source.read(2).unpack('n').first
|
||
|
|
end
|
||
|
|
|
||
|
|
def read_int16_network source
|
||
|
|
str = source.read(2)
|
||
|
|
str.reverse! if byte_order_little? # swap bytes as native=little (and we want network)
|
||
|
|
str.unpack('s').first
|
||
|
|
end
|
||
|
|
|
||
|
|
def read_word32_network source
|
||
|
|
source.read(4).unpack('N').first
|
||
|
|
end
|
||
|
|
|
||
|
|
def byte_order
|
||
|
|
if [0x12345678].pack("L") == "\x12\x34\x56\x78"
|
||
|
|
:BigEndian
|
||
|
|
else
|
||
|
|
:LittleEndian
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
def byte_order_little?
|
||
|
|
(byte_order == :LittleEndian) ? true : false;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
module WriteIOHelpers #:nodoc:
|
||
|
|
def pack_integer(integer)
|
||
|
|
integer = integer & 0x1fffffff
|
||
|
|
if(integer < 0x80)
|
||
|
|
[integer].pack('c')
|
||
|
|
elsif(integer < 0x4000)
|
||
|
|
[integer >> 7 & 0x7f | 0x80].pack('c')+
|
||
|
|
[integer & 0x7f].pack('c')
|
||
|
|
elsif(integer < 0x200000)
|
||
|
|
[integer >> 14 & 0x7f | 0x80].pack('c') +
|
||
|
|
[integer >> 7 & 0x7f | 0x80].pack('c') +
|
||
|
|
[integer & 0x7f].pack('c')
|
||
|
|
else
|
||
|
|
[integer >> 22 & 0x7f | 0x80].pack('c')+
|
||
|
|
[integer >> 15 & 0x7f | 0x80].pack('c')+
|
||
|
|
[integer >> 8 & 0x7f | 0x80].pack('c')+
|
||
|
|
[integer & 0xff].pack('c')
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
def pack_double(double)
|
||
|
|
[double].pack('G')
|
||
|
|
end
|
||
|
|
|
||
|
|
def pack_int8(val)
|
||
|
|
[val].pack('c')
|
||
|
|
end
|
||
|
|
|
||
|
|
def pack_int16_network(val)
|
||
|
|
[val].pack('n')
|
||
|
|
end
|
||
|
|
|
||
|
|
def pack_word32_network(val)
|
||
|
|
str = [val].pack('L')
|
||
|
|
str.reverse! if byte_order_little? # swap bytes as native=little (and we want network)
|
||
|
|
str
|
||
|
|
end
|
||
|
|
|
||
|
|
def byte_order
|
||
|
|
if [0x12345678].pack("L") == "\x12\x34\x56\x78"
|
||
|
|
:BigEndian
|
||
|
|
else
|
||
|
|
:LittleEndian
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
def byte_order_little?
|
||
|
|
(byte_order == :LittleEndian) ? true : false;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|