lib/amq/hacks.rb in amq-protocol-1.2.0 vs lib/amq/hacks.rb in amq-protocol-1.3.0
- old
+ new
@@ -1,33 +1,53 @@
# encoding: binary
+require 'amq/endianness'
+
# Ruby doesn't support pack to/unpack from
# 64bit string in network byte order.
module AMQ
module Hacks
- BIG_ENDIAN = ([1].pack("s") == "\x00\x01")
- Q = "Q".freeze
+ UINT64 = "Q".freeze
+ INT16 = "c".freeze
- if BIG_ENDIAN
- def self.pack_64_big_endian(long_long)
- [long_long].pack(Q)
+ if Endianness.big_endian?
+ def self.pack_uint64_big_endian(long_long)
+ [long_long].pack(UINT64)
end
- def self.unpack_64_big_endian(data)
- data.unpack(Q)
+ def self.unpack_uint64_big_endian(data)
+ data.unpack(UINT64)
end
+
+ def self.pack_int16_big_endian(short)
+ [long_long].pack(INT16)
+ end
+
+ def self.unpack_int16_big_endian(data)
+ data.unpack(INT16)
+ end
else
- def self.pack_64_big_endian(long_long)
- result = [long_long].pack(Q)
+ def self.pack_uint64_big_endian(long_long)
+ result = [long_long].pack(UINT64)
result.bytes.to_a.reverse.map(&:chr).join
end
- def self.unpack_64_big_endian(data)
+ def self.unpack_uint64_big_endian(data)
data = data.bytes.to_a.reverse.map(&:chr).join
- data.unpack(Q)
+ data.unpack(UINT64)
end
+
+ def self.pack_int16_big_endian(short)
+ result = [long_long].pack(INT16)
+ result.bytes.to_a.reverse.map(&:chr).join
+ end
+
+ def self.unpack_int16_big_endian(data)
+ data = data.bytes.to_a.reverse.map(&:chr).join
+ data.unpack(INT16)
+ end
end
end
end
-# AMQ::Hacks.pack_64_big_endian(17)
-# AMQ::Hacks.unpack_64_big_endian("\x00\x00\x00\x00\x00\x00\x00\x11")
+# AMQ::Hacks.pack_uint64_big_endian(17)
+# AMQ::Hacks.unpack_uint64_big_endian("\x00\x00\x00\x00\x00\x00\x00\x11")