Skip to content

Commit

Permalink
Write safe 64-bit integers as INT64 UBJSON types
Browse files Browse the repository at this point in the history
Note: decoded value will be still Long class instance, not Number
  • Loading branch information
Sannis committed Jan 10, 2015
1 parent d59927a commit d4c8a22
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 6 deletions.
16 changes: 10 additions & 6 deletions lib/ubjson-pack.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,20 +50,24 @@ function ubjsonPack(s, b, bo, v, flush) {

// Useful for debugging FPN: http://www.binaryconvert.com/

if (~~v === v) {
if (~~v === v) { // 32-bit integers
if (-128 <= v && v <= 127) {
len = strtok.UINT8.put(b, bo, ubjsonTypes.BYTE, flush);
len = strtok.UINT8.put(b, bo, ubjsonTypes.BYTE, flush);
len += strtok.INT8.put(b, bo + len, v, flush);
} else if (-32428 <= v && v <= 32427) {
len = strtok.UINT8.put(b, bo, ubjsonTypes.INT16, flush);
len = strtok.UINT8.put(b, bo, ubjsonTypes.INT16, flush);
len += strtok.INT16_BE.put(b, bo + len, v, flush);
} else if (-2147483648 <= v && v <= 2147483647) {
len = strtok.UINT8.put(b, bo, ubjsonTypes.INT32, flush);
len = strtok.UINT8.put(b, bo, ubjsonTypes.INT32, flush);
len += strtok.INT32_BE.put(b, bo + len, v, flush);
} else {
encodeNumberAsHuge = true;
// Never happens for 32-bit integers
}
} else {
} else if ((v % 1 === 0) && (-9007199254740992 <= v && v <= 9007199254740992)) { // Safe 64-bit integers
v = Long.fromNumber(v);
len = strtok.UINT8.put(b, bo, ubjsonTypes.INT64, flush);
len += strtok.INT64_BE.put(b, bo + len, v, flush);
} else { // Floating-point numbers
var absV = Math.abs(v);

if (1.18e-38 < absV && absV < 3.40e38) {
Expand Down
2 changes: 2 additions & 0 deletions test/fixtures/int64-numbers/4294967296.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
// Export
module.exports = 4294967296;
Binary file added test/fixtures/int64-numbers/4294967296.ubj
Binary file not shown.
8 changes: 8 additions & 0 deletions test/test-int64-numbers.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
var fs = require('fs');
var UBJSON = require(process.env.LIB_COV ? '../lib-cov/ubjson' : '../');

// Require class for int64 storing
var Long = require('long');

// Create tests for all fixtures files
var files = fs.readdirSync(__dirname + '/fixtures/int64-numbers')
.filter(function(file) { return file.match(/\.js$/); }).sort();
Expand Down Expand Up @@ -46,6 +49,11 @@ files.forEach(function(file) {

UBJSON.unpackBuffer(ubjsonBuffer, function (error, value) {
test.equal(error, null);

if (!Long.isLong(jsObject)) {
jsObject = Long.fromNumber(jsObject);
}

test.deepEqual(value, jsObject);

test.done();
Expand Down

0 comments on commit d4c8a22

Please sign in to comment.