From 5aa830e232f7e95c4e941084900bbdffebd210b9 Mon Sep 17 00:00:00 2001 From: Jimmy Huang Date: Wed, 25 Sep 2019 16:44:56 +0800 Subject: [PATCH 1/2] Fix negative number bug --- lib/write-type.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/write-type.js b/lib/write-type.js index c527743..3cccb0d 100644 --- a/lib/write-type.js +++ b/lib/write-type.js @@ -71,7 +71,7 @@ function getWriteType(options) { // int 8 -- 0xd0 // int 16 -- 0xd1 // int 32 -- 0xd2 - type = (-0x80 <= value) ? 0xd0 : (-0x8000 <= value) ? 0xd1 : 0xd2; + type = (-0x80 <= value) ? 0xd0 : (-0x8000 <= value) ? 0xd1 : (-2147483648 <= value) ? 0xd2 : 0xcb; } token[type](encoder, value); } else { From aca7b8fd7447743923098733556f43fcb0595838 Mon Sep 17 00:00:00 2001 From: Jimmy Huang Date: Thu, 26 Sep 2019 11:41:16 +0800 Subject: [PATCH 2/2] Use better code from marcinkowskip --- lib/write-type.js | 39 +++++++++++++++++---------------------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/lib/write-type.js b/lib/write-type.js index 3cccb0d..c89f761 100644 --- a/lib/write-type.js +++ b/lib/write-type.js @@ -51,34 +51,29 @@ function getWriteType(options) { token[type](encoder, value); } - function isInt(n){ - return Number(n) === n && n % 1 === 0; - } - function number(encoder, value) { var type; - if (isInt(value)) { - if (-0x20 <= value && value <= 0x7F) { - // positive fixint -- 0x00 - 0x7f - // negative fixint -- 0xe0 - 0xff - type = value & 0xFF; - } else if (0 <= value) { - // uint 8 -- 0xcc - // uint 16 -- 0xcd - // uint 32 -- 0xce - type = (value <= 0xFF) ? 0xcc : (value <= 0xFFFF) ? 0xcd : 0xce; - } else { - // int 8 -- 0xd0 - // int 16 -- 0xd1 - // int 32 -- 0xd2 - type = (-0x80 <= value) ? 0xd0 : (-0x8000 <= value) ? 0xd1 : (-2147483648 <= value) ? 0xd2 : 0xcb; - } - token[type](encoder, value); - } else { + if (Math.floor(value) != value) { // float 64 -- 0xcb type = 0xcb; token[type](encoder, value); + return; + } else if (-0x20 <= value && value <= 0x7F) { + // positive fixint -- 0x00 - 0x7f + // negative fixint -- 0xe0 - 0xff + type = value & 0xFF; + } else if (0 <= value) { + // uint 8 -- 0xcc + // uint 16 -- 0xcd + // uint 32 -- 0xce + type = (value <= 0xFF) ? 0xcc : (value <= 0xFFFF) ? 0xcd : (value <= 0xFFFFFFFF) ? 0xce : 0xcf; + } else { + // int 8 -- 0xd0 + // int 16 -- 0xd1 + // int 32 -- 0xd2 + type = (-0x80 <= value) ? 0xd0 : (-0x8000 <= value) ? 0xd1 : (-0x80000000 <= value) ? 0xd2 : 0xd3; } + token[type](encoder, value); } // uint 64 -- 0xcf