diff --git a/lib/buffer.js b/lib/buffer.js index f14783d62650cf..7c0a7f0077f53a 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -552,6 +552,28 @@ Buffer.prototype.readUInt16BE = function(offset, noAssert) { }; +Buffer.prototype.readUInt24LE = function(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) + checkOffset(offset, 3, this.length); + + return ((this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16)); +}; + + +Buffer.prototype.readUInt24BE = function(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) + checkOffset(offset, 3, this.length); + + return ((this[offset] << 16) | + (this[offset + 1] << 8) | + this[offset + 2]); +}; + + Buffer.prototype.readUInt32LE = function(offset, noAssert) { offset = offset >>> 0; if (!noAssert) @@ -643,6 +665,28 @@ Buffer.prototype.readInt16BE = function(offset, noAssert) { }; +Buffer.prototype.readInt24LE = function(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) + checkOffset(offset, 3, this.length); + + return (this[offset]) | + (this[offset + 1] << 8) | + (this[offset + 2] << 16); +}; + + +Buffer.prototype.readInt24BE = function(offset, noAssert) { + offset = offset >>> 0; + if (!noAssert) + checkOffset(offset, 3, this.length); + + return (this[offset] << 16) | + (this[offset + 1] << 8) | + (this[offset + 2]); +}; + + Buffer.prototype.readInt32LE = function(offset, noAssert) { offset = offset >>> 0; if (!noAssert) @@ -775,6 +819,30 @@ Buffer.prototype.writeUInt16BE = function(value, offset, noAssert) { }; +Buffer.prototype.writeUInt24LE = function(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) + checkInt(this, value, offset, 3, 0xffffff, 0); + this[offset + 2] = (value >>> 16); + this[offset + 1] = (value >>> 8); + this[offset] = value; + return offset + 3; +}; + + +Buffer.prototype.writeUInt24BE = function(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) + checkInt(this, value, offset, 3, 0xffffff, 0); + this[offset] = (value >>> 16); + this[offset + 1] = (value >>> 8); + this[offset + 2] = value; + return offset + 3; +}; + + Buffer.prototype.writeUInt32LE = function(value, offset, noAssert) { value = +value; offset = offset >>> 0; @@ -879,6 +947,30 @@ Buffer.prototype.writeInt16BE = function(value, offset, noAssert) { }; +Buffer.prototype.writeInt24LE = function(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) + checkInt(this, value, offset, 3, 0x7fffff, -0x800000); + this[offset] = value; + this[offset + 1] = (value >>> 8); + this[offset + 2] = (value >>> 16); + return offset + 3; +}; + + +Buffer.prototype.writeInt24BE = function(value, offset, noAssert) { + value = +value; + offset = offset >>> 0; + if (!noAssert) + checkInt(this, value, offset, 3, 0x7fffff, -0x800000); + this[offset] = (value >>> 16); + this[offset + 1] = (value >>> 8); + this[offset + 2] = value; + return offset + 3; +}; + + Buffer.prototype.writeInt32LE = function(value, offset, noAssert) { value = +value; offset = offset >>> 0; diff --git a/test/simple/test-writeint.js b/test/simple/test-writeint.js index 10540b6bd75312..a1b52948734c31 100644 --- a/test/simple/test-writeint.js +++ b/test/simple/test-writeint.js @@ -110,6 +110,69 @@ function test16(clazz) { } +function test24(clazz) { + var buffer = new clazz(6); + + buffer.writeInt24BE(0x23, 0); + buffer.writeInt24LE(0x23, 3); + ASSERT.equal(0x00, buffer[0]); + ASSERT.equal(0x00, buffer[1]); + ASSERT.equal(0x23, buffer[2]); + ASSERT.equal(0x23, buffer[3]); + ASSERT.equal(0x00, buffer[4]); + ASSERT.equal(0x00, buffer[5]); + + buffer.writeInt24BE(-5, 0); + buffer.writeInt24LE(-5, 3); + ASSERT.equal(0xff, buffer[0]); + ASSERT.equal(0xff, buffer[1]); + ASSERT.equal(0xfb, buffer[2]); + ASSERT.equal(0xfb, buffer[3]); + ASSERT.equal(0xff, buffer[4]); + ASSERT.equal(0xff, buffer[5]); + + buffer.writeInt24BE(-0x6fffff, 0); + buffer.writeInt24LE(-0x6fffff, 3); + ASSERT.equal(0x90, buffer[0]); + ASSERT.equal(0x00, buffer[1]); + ASSERT.equal(0x01, buffer[2]); + ASSERT.equal(0x01, buffer[3]); + ASSERT.equal(0x00, buffer[4]); + ASSERT.equal(0x90, buffer[5]); + + /* Make sure we handle min/max correctly */ + buffer.writeInt24BE(0x7fffff, 0); + buffer.writeInt24BE(-0x800000, 3); + ASSERT.equal(0x7f, buffer[0]); + ASSERT.equal(0xff, buffer[1]); + ASSERT.equal(0xff, buffer[2]); + ASSERT.equal(0x80, buffer[3]); + ASSERT.equal(0x00, buffer[4]); + ASSERT.equal(0x00, buffer[5]); + ASSERT.throws(function() { + buffer.writeInt24BE(0x7fffff + 1, 0); + }); + ASSERT.throws(function() { + buffer.writeInt24BE(-0x800000 - 1, 0); + }); + + buffer.writeInt24LE(0x7fffff, 0); + buffer.writeInt24LE(-0x800000, 3); + ASSERT.equal(0xff, buffer[0]); + ASSERT.equal(0xff, buffer[1]); + ASSERT.equal(0x7f, buffer[2]); + ASSERT.equal(0x00, buffer[3]); + ASSERT.equal(0x00, buffer[4]); + ASSERT.equal(0x80, buffer[5]); + ASSERT.throws(function() { + buffer.writeInt24LE(0x7fffff + 1, 0); + }); + ASSERT.throws(function() { + buffer.writeInt24LE(-0x800000 - 1, 0); + }); +} + + function test32(clazz) { var buffer = new clazz(8); @@ -185,4 +248,5 @@ function test32(clazz) { test8(Buffer); test16(Buffer); +test24(Buffer); test32(Buffer); diff --git a/test/simple/test-writeuint.js b/test/simple/test-writeuint.js index da0d7952812604..d9e0f85a510f13 100644 --- a/test/simple/test-writeuint.js +++ b/test/simple/test-writeuint.js @@ -100,6 +100,42 @@ function test16(clazz) { } +function test24(clazz) { + var data = new clazz(6); + var value = 0xf90a6d; + + data.writeUInt24BE(value, 0); + ASSERT.equal(0xf9, data[0]); + ASSERT.equal(0x0a, data[1]); + ASSERT.equal(0x6d, data[2]); + + data.writeUInt24BE(value, 1); + ASSERT.equal(0xf9, data[1]); + ASSERT.equal(0x0a, data[2]); + ASSERT.equal(0x6d, data[3]); + + data.writeUInt24BE(value, 2); + ASSERT.equal(0xf9, data[2]); + ASSERT.equal(0x0a, data[3]); + ASSERT.equal(0x6d, data[4]); + + data.writeUInt24LE(value, 0); + ASSERT.equal(0xf9, data[2]); + ASSERT.equal(0x0a, data[1]); + ASSERT.equal(0x6d, data[0]); + + data.writeUInt24LE(value, 1); + ASSERT.equal(0xf9, data[3]); + ASSERT.equal(0x0a, data[2]); + ASSERT.equal(0x6d, data[1]); + + data.writeUInt24LE(value, 2); + ASSERT.equal(0xf9, data[4]); + ASSERT.equal(0x0a, data[3]); + ASSERT.equal(0x6d, data[2]); +} + + function test32(clazz) { var data = new clazz(6); var value = 0xe7f90a6d; @@ -144,4 +180,5 @@ function test32(clazz) { test8(Buffer); test16(Buffer); +test24(Buffer); test32(Buffer);