diff --git a/pack.c b/pack.c index 39a5922..dd6c3f5 100644 --- a/pack.c +++ b/pack.c @@ -733,6 +733,12 @@ pack_pack(VALUE ary, VALUE fmt) bigendian_p = 1; goto pack_integer; + case 'Y': /* unsigned long 64 bit (network byte-order) */ + signed_p = 0; + integer_size = 8; + bigendian_p = 1; + goto pack_integer; + case 'v': /* unsigned short (VAX byte-order) */ signed_p = 0; integer_size = 2; @@ -1301,6 +1307,7 @@ infected_str_new(const char *ptr, long len, VALUE str) * | | * n | Integer | 16-bit unsigned, network (big-endian) byte order * N | Integer | 32-bit unsigned, network (big-endian) byte order + * Y | Integer | 64-bit unsigned, network (big-endian) byte order * v | Integer | 16-bit unsigned, VAX (little-endian) byte order * V | Integer | 32-bit unsigned, VAX (little-endian) byte order * | | @@ -1643,6 +1650,12 @@ pack_unpack(VALUE str, VALUE fmt) bigendian_p = 1; goto unpack_integer; + case 'Y': /* unsigned long 64 bit (network byte-order) */ + signed_p = 0; + integer_size = 8; + bigendian_p = 1; + goto unpack_integer; + case 'v': signed_p = 0; integer_size = 2; diff --git a/test/ruby/test_array.rb b/test/ruby/test_array.rb index 6724634..09fced1 100644 --- a/test/ruby/test_array.rb +++ b/test/ruby/test_array.rb @@ -946,6 +946,14 @@ class TestArray < Test::Unit::TestCase assert_equal(@cls[], a) end + def test_pack_64_network + assert_equal("\x0\x0\x0\x1\x0\x0\x0\x1", [(1 << 32) + 1].pack('Y')) + end + + def test_unpack_64_network + assert_equal((1 << 32) + 1, "\x0\x0\x0\x1\x0\x0\x0\x1".unpack('Y').first) + end + def test_pack a = @cls[*%w( cat wombat x yy)] assert_equal("catwomx yy ", a.pack("A3A3A3A3"))