Skip to content

Commit c64e843

Browse files
author
余化
committed
decode double with type
1 parent c403d27 commit c64e843

File tree

2 files changed

+28
-20
lines changed

2 files changed

+28
-20
lines changed

lib/v2/decoder.js

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ proto.readInt = function (withType) {
116116
} else {
117117
this.throwError('readInt', code);
118118
}
119-
119+
120120
return this.handleType('int', val, withType);
121121
};
122122

@@ -246,29 +246,27 @@ utils.addByteCodes(BYTE_CODES, [
246246
* @return {Number}
247247
* @api public
248248
*/
249-
proto.readDouble = function () {
249+
proto.readDouble = function (withType) {
250250
var code = this.byteBuffer.get();
251+
var val;
251252
if (code === 0x44) {
252-
return this.byteBuffer.getDouble();
253+
val = this.byteBuffer.getDouble();
254+
} else if (code === 0x5b) {
255+
// Compact double
256+
val = 0.0;
257+
} else if (code === 0x5c) {
258+
val = 1.0;
259+
} else if (code === 0x5d) {
260+
val = this.byteBuffer.getInt8();
261+
} else if (code === 0x5e) {
262+
val = this.byteBuffer.getInt16();
263+
} else if (code === 0x5f) {
264+
val = this.byteBuffer.getInt32() * 0.001;
265+
} else {
266+
this.throwError('readDouble', code);
253267
}
254268

255-
// Compact double
256-
if (code === 0x5b) {
257-
return 0.0;
258-
}
259-
if (code === 0x5c) {
260-
return 1.0;
261-
}
262-
if (code === 0x5d) {
263-
return this.byteBuffer.getInt8();
264-
}
265-
if (code === 0x5e) {
266-
return this.byteBuffer.getInt16();
267-
}
268-
if (code === 0x5f) {
269-
return this.byteBuffer.getInt32() * 0.001;
270-
}
271-
this.throwError('readDouble', code);
269+
return this.handleType('double', val, withType);
272270
};
273271

274272
utils.addByteCodes(BYTE_CODES, [

test/double.test.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,14 +105,17 @@ describe('double.test.js', function () {
105105
describe('v2.0', function () {
106106
it('should read 0.0 and 1.0', function () {
107107
hessian.decode(new Buffer([0x5b]), '2.0').should.equal(0.0);
108+
hessian.decode(new Buffer([0x5b]), '2.0', true).should.eql({$class: 'double', $: 0.0});
108109
hessian.decode(new Buffer([0x5c]), '2.0').should.equal(1.0);
110+
hessian.decode(new Buffer([0x5c]), '2.0', true).should.eql({$class: 'double', $: 1.0});
109111
});
110112

111113
it('should read 8 bits double', function () {
112114
hessian.decode(new Buffer([0x5d, 0x00]), '2.0').should.equal(0.0);
113115
hessian.decode(new Buffer([0x5d, 0x01]), '2.0').should.equal(1.0);
114116
hessian.decode(new Buffer([0x5d, 0x80]), '2.0').should.equal(-128.0);
115117
hessian.decode(new Buffer([0x5d, 0x7f]), '2.0').should.equal(127.0);
118+
hessian.decode(new Buffer([0x5d, 0x7f]), '2.0', true).should.eql({$class: 'double', $: 127.0});
116119
});
117120

118121
it('should read 16 bits double', function () {
@@ -121,16 +124,20 @@ describe('double.test.js', function () {
121124
hessian.decode(new Buffer([0x5e, 0x00, 0x80]), '2.0').should.equal(128.0);
122125
hessian.decode(new Buffer([0x5e, 0x00, 0x7f]), '2.0').should.equal(127.0);
123126
hessian.decode(new Buffer([0x5e, 0x80, 0x00]), '2.0').should.equal(-32768.0);
127+
hessian.decode(new Buffer([0x5e, 0x80, 0x00]), '2.0', true).should.eql({$class: 'double', $: -32768.0});
124128
hessian.decode(new Buffer([0x5e, 0x7f, 0xff]), '2.0').should.equal(32767.0);
125129
});
126130

127131
it('should read 32 bits float double', function () {
128132
hessian.decode(new Buffer([0x5f, 0x00, 0x00, 0x00, 0x00]), '2.0').should.equal(0.0);
133+
hessian.decode(new Buffer([0x5f, 0x00, 0x00, 0x00, 0x00]), '2.0', true).should.eql({$class: 'double', $: 0.0});
129134
hessian.decode(new Buffer([0x5f, 0x00, 0x00, 0x2f, 0xda]), '2.0').should.equal(12.25);
135+
hessian.decode(new Buffer([0x5f, 0x00, 0x00, 0x2f, 0xda]), '2.0', true).should.eql({$class: 'double', $: 12.25});
130136
});
131137

132138
it('should read normal double', function () {
133139
hessian.decode(new Buffer([0x44, 0x40, 0x24, 0, 0, 0, 0, 0, 0]), '2.0').should.equal(10.0);
140+
hessian.decode(new Buffer([0x44, 0x40, 0x24, 0, 0, 0, 0, 0, 0]), '2.0', true).should.eql({$class: 'double', $: 10.0});
134141
});
135142

136143
it('should write 0.0 and 1.0', function () {
@@ -183,6 +190,7 @@ describe('double.test.js', function () {
183190
hessian.decode(utils.bytes('v2/double/10.1'), '2.0').should.equal(10.1);
184191
hessian.decode(utils.bytes('v2/double/-128'), '2.0').should.equal(-128);
185192
hessian.decode(utils.bytes('v2/double/-127.9999'), '2.0').should.equal(-127.9999);
193+
hessian.decode(utils.bytes('v2/double/-127.9999'), '2.0', true).should.eql({$class: 'double', $: -127.9999});
186194
hessian.decode(utils.bytes('v2/double/127'), '2.0').should.equal(127);
187195
hessian.decode(utils.bytes('v2/double/126.9989'), '2.0').should.equal(126.9989);
188196
hessian.decode(utils.bytes('v2/double/-32768'), '2.0').should.equal(-32768);
@@ -203,6 +211,7 @@ describe('double.test.js', function () {
203211
hessian.decode(utils.bytes('v2/double/2147483647'), '2.0').should.equal(2147483647);
204212
hessian.decode(utils.bytes('v2/double/2147483646'), '2.0').should.equal(2147483646);
205213
hessian.decode(utils.bytes('v2/double/2147483646.456'), '2.0').should.equal(2147483646.456);
214+
hessian.decode(utils.bytes('v2/double/2147483646.456'), '2.0', true).should.eql({$class: 'double', $: 2147483646.456});
206215
});
207216

208217
it('should read java hessian 1.0 bin format', function () {
@@ -229,6 +238,7 @@ describe('double.test.js', function () {
229238
hessian.decode(utils.bytes('v1/double/2147483647'), '2.0').should.equal(2147483647);
230239
hessian.decode(utils.bytes('v1/double/2147483646'), '2.0').should.equal(2147483646);
231240
hessian.decode(utils.bytes('v1/double/2147483646.456'), '2.0').should.equal(2147483646.456);
241+
hessian.decode(utils.bytes('v1/double/2147483646.456'), '2.0', true).should.eql({$class: 'double', $: 2147483646.456});
232242
});
233243
});
234244
});

0 commit comments

Comments
 (0)