buffer: optimize writeInt* methods
Remove unnecessary encoding within writeInt*
This commit is contained in:
parent
54da818e4b
commit
2ca6905160
@ -678,50 +678,11 @@ Buffer.prototype.writeUInt32BE = function(value, offset, noAssert) {
|
|||||||
return writeUInt32(this, value, offset, true);
|
return writeUInt32(this, value, offset, true);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We now move onto our friends in the signed number category. Unlike unsigned
|
|
||||||
* numbers, we're going to have to worry a bit more about how we put values into
|
|
||||||
* arrays. Since we are only worrying about signed 32-bit values, we're in
|
|
||||||
* slightly better shape. Unfortunately, we really can't do our favorite binary
|
|
||||||
* & in this system. It really seems to do the wrong thing. For example:
|
|
||||||
*
|
|
||||||
* > -32 & 0xff
|
|
||||||
* 224
|
|
||||||
*
|
|
||||||
* What's happening above is really: 0xe0 & 0xff = 0xe0. However, the results of
|
|
||||||
* this aren't treated as a signed number. Ultimately a bad thing.
|
|
||||||
*
|
|
||||||
* What we're going to want to do is basically create the unsigned equivalent of
|
|
||||||
* our representation and pass that off to the wuint* functions. To do that
|
|
||||||
* we're going to do the following:
|
|
||||||
*
|
|
||||||
* - if the value is positive
|
|
||||||
* we can pass it directly off to the equivalent wuint
|
|
||||||
* - if the value is negative
|
|
||||||
* we do the following computation:
|
|
||||||
* mb + val + 1, where
|
|
||||||
* mb is the maximum unsigned value in that byte size
|
|
||||||
* val is the Javascript negative integer
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* As a concrete value, take -128. In signed 16 bits this would be 0xff80. If
|
|
||||||
* you do out the computations:
|
|
||||||
*
|
|
||||||
* 0xffff - 128 + 1
|
|
||||||
* 0xffff - 127
|
|
||||||
* 0xff80
|
|
||||||
*
|
|
||||||
* You can then encode this value as the signed version. This is really rather
|
|
||||||
* hacky, but it should work and get the job done which is our goal here.
|
|
||||||
*/
|
|
||||||
|
|
||||||
Buffer.prototype.writeInt8 = function(value, offset, noAssert) {
|
Buffer.prototype.writeInt8 = function(value, offset, noAssert) {
|
||||||
value = +value;
|
value = +value;
|
||||||
offset = offset >>> 0;
|
offset = offset >>> 0;
|
||||||
if (!noAssert)
|
if (!noAssert)
|
||||||
checkInt(this, value, offset, 1, 0x7f, -0x80);
|
checkInt(this, value, offset, 1, 0x7f, -0x80);
|
||||||
if (value < 0) value = 0xff + value + 1;
|
|
||||||
this[offset] = value;
|
this[offset] = value;
|
||||||
return offset + 1;
|
return offset + 1;
|
||||||
};
|
};
|
||||||
@ -732,7 +693,6 @@ Buffer.prototype.writeInt16LE = function(value, offset, noAssert) {
|
|||||||
offset = offset >>> 0;
|
offset = offset >>> 0;
|
||||||
if (!noAssert)
|
if (!noAssert)
|
||||||
checkInt(this, value, offset, 2, 0x7fff, -0x8000);
|
checkInt(this, value, offset, 2, 0x7fff, -0x8000);
|
||||||
if (value < 0) value = 0xffff + value + 1;
|
|
||||||
return writeUInt16(this, value, offset, false);
|
return writeUInt16(this, value, offset, false);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -742,7 +702,6 @@ Buffer.prototype.writeInt16BE = function(value, offset, noAssert) {
|
|||||||
offset = offset >>> 0;
|
offset = offset >>> 0;
|
||||||
if (!noAssert)
|
if (!noAssert)
|
||||||
checkInt(this, value, offset, 2, 0x7fff, -0x8000);
|
checkInt(this, value, offset, 2, 0x7fff, -0x8000);
|
||||||
if (value < 0) value = 0xffff + value + 1;
|
|
||||||
return writeUInt16(this, value, offset, true);
|
return writeUInt16(this, value, offset, true);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -752,7 +711,6 @@ Buffer.prototype.writeInt32LE = function(value, offset, noAssert) {
|
|||||||
offset = offset >>> 0;
|
offset = offset >>> 0;
|
||||||
if (!noAssert)
|
if (!noAssert)
|
||||||
checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000);
|
checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000);
|
||||||
if (value < 0) value = 0xffffffff + value + 1;
|
|
||||||
return writeUInt32(this, value, offset, false);
|
return writeUInt32(this, value, offset, false);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -762,6 +720,5 @@ Buffer.prototype.writeInt32BE = function(value, offset, noAssert) {
|
|||||||
offset = offset >>> 0;
|
offset = offset >>> 0;
|
||||||
if (!noAssert)
|
if (!noAssert)
|
||||||
checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000);
|
checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000);
|
||||||
if (value < 0) value = 0xffffffff + value + 1;
|
|
||||||
return writeUInt32(this, value, offset, true);
|
return writeUInt32(this, value, offset, true);
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user