Skip to content

Commit 3616fd6

Browse files
author
Yuki Ito
committed
Support NaN and Infinity, closes #72
1 parent f4639fb commit 3616fd6

2 files changed

Lines changed: 23 additions & 0 deletions

File tree

src/msgpack_unpacker.erl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,20 @@ unpack_stream(<<16#C6, L:32/big-unsigned-integer-unit:1, V:L/binary, Rest/binary
4747
%% Floats
4848
unpack_stream(<<16#CA, V:32/float-unit:1, Rest/binary>>, _) ->
4949
{V, Rest};
50+
unpack_stream(<<16#CA, 0:1, 16#FF:8, 0:23, Rest/binary>>, _) ->
51+
{positive_infinity, Rest};
52+
unpack_stream(<<16#CA, 1:1, 16#FF:8, 0:23 , Rest/binary>>, _) ->
53+
{negative_infinity, Rest};
54+
unpack_stream(<<16#CA, _:1, 16#FF:8, _:23 , Rest/binary>>, _) ->
55+
{nan, Rest};
5056
unpack_stream(<<16#CB, V:64/float-unit:1, Rest/binary>>, _) ->
5157
{V, Rest};
58+
unpack_stream(<<16#CB, 0:1, 2#11111111111:11, 0:52, Rest/binary>>, _) ->
59+
{positive_infinity, Rest};
60+
unpack_stream(<<16#CB, 1:1, 2#11111111111:11, 0:52 , Rest/binary>>, _) ->
61+
{negative_infinity, Rest};
62+
unpack_stream(<<16#CB, _:1, 2#11111111111:11, _:52 , Rest/binary>>, _) ->
63+
{nan, Rest};
5264

5365
%% Unsigned integers
5466
unpack_stream(<<16#CC, V:8/unsigned-integer, Rest/binary>>, _) ->

test/msgpack_tests.erl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -625,3 +625,14 @@ unpack_str_validation_test_() ->
625625
msgpack:unpack(binary_to_list(InvalidStr),
626626
[{spec,new},{unpack_str,from_list},{validate_string,true}]))]}
627627
].
628+
629+
630+
float_unpacking_test_() ->
631+
%% float 32
632+
[?_assertEqual({ok, nan}, msgpack:unpack(<<16#CA, 16#FF, 16#FF, 16#FF, 16#FF>>)),
633+
?_assertEqual({ok, positive_infinity}, msgpack:unpack(<<16#CA, 16#7F, 16#80, 16#00, 16#00>>)),
634+
?_assertEqual({ok, negative_infinity}, msgpack:unpack(<<16#CA, 16#FF, 16#80, 16#00, 16#00>>)),
635+
%% float 64
636+
?_assertEqual({ok, nan}, msgpack:unpack(<<16#CB, 16#FF, 16#FF, 16#FF, 16#FF, 16#FF, 16#FF, 16#FF, 16#FF>>)),
637+
?_assertEqual({ok, positive_infinity}, msgpack:unpack(<<16#CB, 16#7F, 16#F0, 16#00, 16#00, 16#00, 16#00, 16#00, 16#00>>)),
638+
?_assertEqual({ok, negative_infinity}, msgpack:unpack(<<16#CB, 16#FF, 16#F0, 16#00, 16#00, 16#00, 16#00, 16#00, 16#00>>))].

0 commit comments

Comments
 (0)