|
|
|
# Buffer
|
|
|
|
|
|
|
|
Stability: 2 - Stable
|
|
|
|
|
|
|
|
Prior to the introduction of `TypedArray` in ECMAScript 2015 (ES6), the
|
|
|
|
JavaScript language had no mechanism for reading or manipulating streams
|
|
|
|
of binary data. The `Buffer` class was introduced as part of the Node.js
|
|
|
|
API to make it possible to interact with octet streams in the context of things
|
|
|
|
like TCP streams and file system operations.
|
|
|
|
|
|
|
|
Now that `TypedArray` has been added in ES6, the `Buffer` class implements the
|
|
|
|
`Uint8Array` API in a manner that is more optimized and suitable for Node.js'
|
|
|
|
use cases.
|
|
|
|
|
|
|
|
Instances of the `Buffer` class are similar to arrays of integers but
|
|
|
|
correspond to fixed-sized, raw memory allocations outside the V8 heap.
|
|
|
|
The size of the `Buffer` is established when it is created and cannot be
|
|
|
|
resized.
|
|
|
|
|
|
|
|
The `Buffer` class is a global within Node.js, making it unlikely that one
|
|
|
|
would need to ever use `require('buffer')`.
|
|
|
|
|
|
|
|
const buf1 = new Buffer(10);
|
|
|
|
// creates a buffer of length 10
|
|
|
|
|
|
|
|
const buf2 = new Buffer([1,2,3]);
|
|
|
|
// creates a buffer containing [01, 02, 03]
|
|
|
|
|
|
|
|
const buf3 = new Buffer('test');
|
|
|
|
// creates a buffer containing ASCII bytes [74, 65, 73, 74]
|
|
|
|
|
|
|
|
const buf4 = new Buffer('tést', 'utf8');
|
|
|
|
// creates a buffer containing UTF8 bytes [74, c3, a9, 73, 74]
|
|
|
|
|
|
|
|
## Buffers and Character Encodings
|
|
|
|
|
|
|
|
Buffers are commonly used to represent sequences of encoded characters
|
|
|
|
such as UTF8, UCS2, Base64 or even Hex-encoded data. It is possible to
|
|
|
|
convert back and forth between Buffers and ordinary JavaScript string objects
|
|
|
|
by using an explicit encoding method.
|
|
|
|
|
|
|
|
const buf = new Buffer('hello world', 'ascii');
|
|
|
|
console.log(buf.toString('hex'));
|
|
|
|
// prints: 68656c6c6f20776f726c64
|
|
|
|
console.log(buf.toString('base64'));
|
|
|
|
// prints: aGVsbG8gd29ybGQ=
|
|
|
|
|
|
|
|
The character encodings currently supported by Node.js include:
|
|
|
|
|
|
|
|
* `'ascii'` - for 7-bit ASCII data only. This encoding method is very fast and
|
|
|
|
will strip the high bit if set.
|
|
|
|
|
|
|
|
* `'utf8'` - Multibyte encoded Unicode characters. Many web pages and other
|
|
|
|
document formats use UTF-8.
|
|
|
|
|
|
|
|
* `'utf16le'` - 2 or 4 bytes, little-endian encoded Unicode characters.
|
|
|
|
Surrogate pairs (U+10000 to U+10FFFF) are supported.
|
|
|
|
|
|
|
|
* `'ucs2'` - Alias of `'utf16le'`.
|
|
|
|
|
|
|
|
* `'base64'` - Base64 string encoding.
|
|
|
|
|
|
|
|
* `'binary'` - A way of encoding the buffer into a one-byte (`latin-1`)
|
|
|
|
encoded string. The string `'latin-1'` is not supported. Instead, pass
|
|
|
|
`'binary'` to use `'latin-1'` encoding.
|
|
|
|
|
|
|
|
* `'hex'` - Encode each byte as two hexadecimal characters.
|
|
|
|
|
|
|
|
## Buffers and TypedArray
|
|
|
|
|
|
|
|
Buffers are also `Uint8Array` TypedArray instances. However, there are subtle
|
|
|
|
incompatibilities with the TypedArray specification in ECMAScript 2015. For
|
|
|
|
instance, while `ArrayBuffer#slice()` creates a copy of the slice,
|
|
|
|
the implementation of [`Buffer#slice()`][] creates a view over the existing
|
|
|
|
Buffer without copying, making `Buffer#slice()` far more efficient.
|
|
|
|
|
|
|
|
It is also possible to create new TypedArray instances from a `Buffer` with the
|
|
|
|
following caveats:
|
|
|
|
|
|
|
|
1. The Buffer instances's memory is copied to the TypedArray, not shared.
|
|
|
|
|
|
|
|
2. The Buffer's memory is interpreted as an array of distinct elements, and not
|
|
|
|
as a byte array of the target type. That is,
|
|
|
|
`new Uint32Array(new Buffer([1,2,3,4]))` creates a 4-element `Uint32Array`
|
|
|
|
with elements `[1,2,3,4]`, not a `Uint32Array` with a single element
|
|
|
|
`[0x1020304]` or `[0x4030201]`.
|
|
|
|
|
|
|
|
It is possible to create a new Buffer that shares the same allocated memory as
|
|
|
|
a TypedArray instance by using the TypeArray objects `.buffer` property:
|
|
|
|
|
|
|
|
const arr = new Uint16Array(2);
|
|
|
|
arr[0] = 5000;
|
|
|
|
arr[1] = 4000;
|
|
|
|
|
|
|
|
const buf1 = new Buffer(arr); // copies the buffer
|
|
|
|
const buf2 = new Buffer(arr.buffer); // shares the memory with arr;
|
|
|
|
|
|
|
|
console.log(buf1);
|
|
|
|
// Prints: <Buffer 88 a0>, copied buffer has only two elements
|
|
|
|
console.log(buf2);
|
|
|
|
// Prints: <Buffer 88 13 a0 0f>
|
|
|
|
|
|
|
|
arr[1] = 6000;
|
|
|
|
console.log(buf1);
|
|
|
|
// Prints: <Buffer 88 a0>
|
|
|
|
console.log(buf2);
|
|
|
|
// Prints: <Buffer 88 13 70 17>
|
|
|
|
|
|
|
|
Note that when creating a Buffer using the TypeArray's `.buffer`, it is not
|
|
|
|
currently possible to use only a portion of the underlying `ArrayBuffer`. To
|
|
|
|
create a Buffer that uses only a part of the `ArrayBuffer`, use the
|
|
|
|
`buf.slice()` function after the Buffer is created:
|
|
|
|
|
|
|
|
const arr = new Uint16Array(20);
|
|
|
|
const buf = new Buffer(arr.buffer).slice(0, 16);
|
|
|
|
console.log(buf.length);
|
|
|
|
// Prints: 16
|
|
|
|
|
|
|
|
## Buffers and ES6 iteration
|
|
|
|
|
|
|
|
Buffers can be iterated over using the ECMAScript 2015 (ES6) `for..of` syntax:
|
|
|
|
|
|
|
|
const buf = new Buffer([1, 2, 3]);
|
|
|
|
|
|
|
|
for (var b of buf)
|
|
|
|
console.log(b)
|
|
|
|
|
|
|
|
// Prints:
|
|
|
|
// 1
|
|
|
|
// 2
|
|
|
|
// 3
|
|
|
|
|
|
|
|
Additionally, the `buffer.values()`, `buffer.keys()`, and `buffer.entries()`
|
|
|
|
methods can be used to create iterators.
|
|
|
|
|
|
|
|
## Class: Buffer
|
|
|
|
|
|
|
|
The Buffer class is a global type for dealing with binary data directly.
|
|
|
|
It can be constructed in a variety of ways.
|
|
|
|
|
|
|
|
### new Buffer(array)
|
|
|
|
|
|
|
|
* `array` Array
|
|
|
|
|
|
|
|
Allocates a new Buffer using an `array` of octets.
|
|
|
|
|
|
|
|
const buf = new Buffer([0x62,0x75,0x66,0x66,0x65,0x72]);
|
|
|
|
// creates a new Buffer containing ASCII bytes
|
|
|
|
// ['b','u','f','f','e','r']
|
|
|
|
|
|
|
|
### new Buffer(buffer)
|
|
|
|
|
|
|
|
* `buffer` {Buffer}
|
|
|
|
|
|
|
|
Copies the passed `buffer` data onto a new `Buffer` instance.
|
|
|
|
|
|
|
|
const buf1 = new Buffer('buffer');
|
|
|
|
const buf2 = new Buffer(buf1);
|
|
|
|
|
|
|
|
buf1[0] = 0x61;
|
|
|
|
console.log(buf1.toString());
|
|
|
|
// 'auffer'
|
|
|
|
console.log(buf2.toString());
|
|
|
|
// 'buffer' (copy is not changed)
|
|
|
|
|
|
|
|
### new Buffer(arrayBuffer)
|
|
|
|
|
|
|
|
* `arrayBuffer` - The `.buffer` property of a `TypedArray` or a `new
|
|
|
|
ArrayBuffer()`
|
|
|
|
|
|
|
|
When passed a reference to the `.buffer` property of a `TypedArray` instance,
|
|
|
|
the newly created Buffer will share the same allocated memory as the
|
|
|
|
TypedArray.
|
|
|
|
|
|
|
|
const arr = new Uint16Array(2);
|
|
|
|
arr[0] = 5000;
|
|
|
|
arr[1] = 4000;
|
|
|
|
|
|
|
|
const buf = new Buffer(arr.buffer); // shares the memory with arr;
|
|
|
|
|
|
|
|
console.log(buf);
|
|
|
|
// Prints: <Buffer 88 13 a0 0f>
|
|
|
|
|
|
|
|
// changing the TypdArray changes the Buffer also
|
|
|
|
arr[1] = 6000;
|
|
|
|
|
|
|
|
console.log(buf);
|
|
|
|
// Prints: <Buffer 88 13 70 17>
|
|
|
|
|
|
|
|
### new Buffer(size)
|
|
|
|
|
|
|
|
* `size` Number
|
|
|
|
|
|
|
|
Allocates a new Buffer of `size` bytes. The `size` must be less than
|
|
|
|
or equal to the value of `require('buffer').kMaxLength` (on 64-bit
|
|
|
|
architectures, `kMaxLength` is `(2^31)-1`). Otherwise, a [`RangeError`][] is
|
|
|
|
thrown. If a `size` less than 0 is specified, a zero-length Buffer will be
|
|
|
|
created.
|
|
|
|
|
|
|
|
Unlike `ArrayBuffers`, the underlying memory for Buffer instances created in
|
|
|
|
this way is not initialized. The contents of a newly created `Buffer` are
|
|
|
|
unknown and could contain sensitive data. Use [`buf.fill(0)`][] to initialize a
|
|
|
|
Buffer to zeroes.
|
|
|
|
|
|
|
|
const buf = new Buffer(5);
|
|
|
|
console.log(buf);
|
|
|
|
// <Buffer 78 e0 82 02 01>
|
|
|
|
// (octets will be different, every time)
|
|
|
|
buf.fill(0);
|
|
|
|
console.log(buf);
|
|
|
|
// <Buffer 00 00 00 00 00>
|
|
|
|
|
|
|
|
### new Buffer(str[, encoding])
|
|
|
|
|
|
|
|
* `str` String - string to encode.
|
|
|
|
* `encoding` String - encoding to use, Optional.
|
|
|
|
|
|
|
|
Creates a new Buffer containing the given JavaScript string `str`. If
|
|
|
|
provided, the `encoding` parameter identifies the strings character encoding.
|
|
|
|
If not provided, `encoding` defaults to `'utf8'`.
|
|
|
|
|
|
|
|
const buf1 = new Buffer('this is a tést');
|
|
|
|
console.log(buf1.toString());
|
|
|
|
// prints: this is a tést
|
|
|
|
console.log(buf1.toString('ascii'));
|
|
|
|
// prints: this is a tC)st
|
|
|
|
|
|
|
|
const buf2 = new Buffer('7468697320697320612074c3a97374', 'hex');
|
|
|
|
console.log(buf2.toString());
|
|
|
|
// prints: this is a tést
|
|
|
|
|
|
|
|
### Class Method: Buffer.byteLength(string[, encoding])
|
|
|
|
|
|
|
|
* `string` String
|
|
|
|
* `encoding` String, Optional, Default: 'utf8'
|
|
|
|
* Return: Number
|
|
|
|
|
|
|
|
Returns the actual byte length of a string. If not specified, `encoding`
|
|
|
|
defaults to `'utf8'`. This is not the same as [`String.prototype.length`][]
|
|
|
|
since that returns the number of *characters* in a string.
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
|
|
|
const str = '\u00bd + \u00bc = \u00be';
|
|
|
|
|
|
|
|
console.log(`${str}: ${str.length} characters, ` +
|
|
|
|
`${Buffer.byteLength(str, 'utf8')} bytes`);
|
|
|
|
|
|
|
|
// ½ + ¼ = ¾: 9 characters, 12 bytes
|
|
|
|
|
|
|
|
### Class Method: Buffer.compare(buf1, buf2)
|
|
|
|
|
|
|
|
* `buf1` {Buffer}
|
|
|
|
* `buf2` {Buffer}
|
|
|
|
|
|
|
|
Compares `buf1` to `buf2` typically for the purpose of sorting arrays of
|
|
|
|
Buffers. This is equivalent is calling `buf1.compare(buf2)`.
|
|
|
|
|
|
|
|
const arr = [Buffer('1234'), Buffer('0123')];
|
|
|
|
arr.sort(Buffer.compare);
|
|
|
|
|
|
|
|
### Class Method: Buffer.concat(list[, totalLength])
|
|
|
|
|
|
|
|
* `list` {Array} List of Buffer objects to concat
|
|
|
|
* `totalLength` {Number} Total length of the Buffers in the list when concatenated
|
|
|
|
|
|
|
|
Returns a new Buffer which is the result of concatenating all the Buffers in
|
|
|
|
the `list` together.
|
|
|
|
|
|
|
|
If the list has no items, or if the `totalLength` is 0, then a new zero-length
|
|
|
|
Buffer is returned.
|
|
|
|
|
|
|
|
If `totalLength` is not provided, it is calculated from the Buffers in the
|
|
|
|
`list`. This, however, adds an additional loop to the function, so it is faster
|
|
|
|
to provide the length explicitly.
|
|
|
|
|
|
|
|
Example: build a single Buffer from a list of three Buffers:
|
|
|
|
|
|
|
|
const buf1 = new Buffer(10).fill(0);
|
|
|
|
const buf2 = new Buffer(14).fill(0);
|
|
|
|
const buf3 = new Buffer(18).fill(0);
|
|
|
|
const totalLength = buf1.length + buf2.length + buf3.length;
|
|
|
|
|
|
|
|
console.log(totalLength);
|
|
|
|
const bufA = Buffer.concat([buf1, buf2, buf3], totalLength);
|
|
|
|
console.log(bufA);
|
|
|
|
console.log(bufA.length);
|
|
|
|
|
|
|
|
// 42
|
|
|
|
// <Buffer 00 00 00 00 ...>
|
|
|
|
// 42
|
|
|
|
|
|
|
|
### Class Method: Buffer.isBuffer(obj)
|
|
|
|
|
|
|
|
* `obj` Object
|
|
|
|
* Return: Boolean
|
|
|
|
|
|
|
|
Returns 'true' if `obj` is a Buffer.
|
|
|
|
|
|
|
|
### Class Method: Buffer.isEncoding(encoding)
|
|
|
|
|
|
|
|
* `encoding` {String} The encoding string to test
|
|
|
|
|
|
|
|
Returns true if the `encoding` is a valid encoding argument, or false
|
|
|
|
otherwise.
|
|
|
|
|
|
|
|
### buffer.entries()
|
|
|
|
|
|
|
|
Creates and returns an [iterator][] of `[index, byte]` pairs from the Buffer
|
|
|
|
contents.
|
|
|
|
|
|
|
|
const buf = new Buffer('buffer');
|
|
|
|
for (var pair of buf.entries()) {
|
|
|
|
console.log(pair);
|
|
|
|
}
|
|
|
|
// prints:
|
|
|
|
// [0, 98]
|
|
|
|
// [1, 117]
|
|
|
|
// [2, 102]
|
|
|
|
// [3, 102]
|
|
|
|
// [4, 101]
|
|
|
|
// [5, 114]
|
|
|
|
|
|
|
|
### buffer.keys()
|
|
|
|
|
|
|
|
Creates and returns an [iterator][] of Buffer keys (indices).
|
|
|
|
|
|
|
|
const buf = new Buffer('buffer');
|
|
|
|
for (var key of buf.keys()) {
|
|
|
|
console.log(key);
|
|
|
|
}
|
|
|
|
// prints:
|
|
|
|
// 0
|
|
|
|
// 1
|
|
|
|
// 2
|
|
|
|
// 3
|
|
|
|
// 4
|
|
|
|
// 5
|
|
|
|
|
|
|
|
### buffer.values()
|
|
|
|
|
|
|
|
Creates and returns an [iterator][] for Buffer values (bytes). This function is
|
|
|
|
called automatically when the Buffer is used in a `for..of` statement.
|
|
|
|
|
|
|
|
const buf = new Buffer('buffer');
|
|
|
|
for (var value of buf.values()) {
|
|
|
|
console.log(value);
|
|
|
|
}
|
|
|
|
// prints:
|
|
|
|
// 98
|
|
|
|
// 117
|
|
|
|
// 102
|
|
|
|
// 102
|
|
|
|
// 101
|
|
|
|
// 114
|
|
|
|
|
|
|
|
for (var value of buf) {
|
|
|
|
console.log(value);
|
|
|
|
}
|
|
|
|
// prints:
|
|
|
|
// 98
|
|
|
|
// 117
|
|
|
|
// 102
|
|
|
|
// 102
|
|
|
|
// 101
|
|
|
|
// 114
|
|
|
|
|
|
|
|
### buf[index]
|
|
|
|
|
|
|
|
<!--type=property-->
|
|
|
|
<!--name=[index]-->
|
|
|
|
|
|
|
|
The index operator `[index]` can be used to get and set the octet at position
|
|
|
|
`index` in the Buffer. The values refer to individual bytes, so the legal value
|
|
|
|
range is between `0x00` and `0xFF` (hex) or `0` and `255` (decimal).
|
|
|
|
|
|
|
|
Example: copy an ASCII string into a Buffer, one byte at a time:
|
|
|
|
|
|
|
|
const str = "Node.js";
|
|
|
|
const buf = new Buffer(str.length);
|
|
|
|
|
|
|
|
for (var i = 0; i < str.length ; i++) {
|
|
|
|
buf[i] = str.charCodeAt(i);
|
|
|
|
}
|
|
|
|
|
|
|
|
console.log(buf);
|
|
|
|
// Prints: Node.js
|
|
|
|
|
|
|
|
### buf.compare(otherBuffer)
|
|
|
|
|
|
|
|
* `otherBuffer` {Buffer}
|
|
|
|
|
|
|
|
Compares two Buffer instances and returns a number indicating whether `buf`
|
|
|
|
comes before, after, or is the same as the `otherBuffer` in sort order.
|
|
|
|
Comparison is based on the actual sequence of bytes in each Buffer.
|
|
|
|
|
|
|
|
* `0` is returned if `otherBuffer` is the same as `buf`
|
|
|
|
* `1` is returned if `otherBuffer` should come *before* `buf` when sorted.
|
|
|
|
* `-1` is returned if `otherBuffer` should come *after* `buf` when sorted.
|
|
|
|
|
|
|
|
```
|
|
|
|
const buf1 = new Buffer('ABC');
|
|
|
|
const buf2 = new Buffer('BCD');
|
|
|
|
const buf3 = new Buffer('ABCD');
|
|
|
|
|
|
|
|
console.log(buf1.compare(buf1));
|
|
|
|
// Prints: 0
|
|
|
|
console.log(buf1.compare(buf2));
|
|
|
|
// Prints: -1
|
|
|
|
console.log(buf1.compare(buf3));
|
|
|
|
// Prints: 1
|
|
|
|
console.log(buf2.compare(buf1));
|
|
|
|
// Prints: 1
|
|
|
|
console.log(buf2.compare(buf3));
|
|
|
|
// Prints: 1
|
|
|
|
|
|
|
|
[buf1, buf2, buf3].sort(Buffer.compare);
|
|
|
|
// produces sort order [buf1, buf3, buf2]
|
|
|
|
```
|
|
|
|
|
|
|
|
### buf.copy(targetBuffer[, targetStart][, sourceStart][, sourceEnd])
|
|
|
|
|
|
|
|
* `targetBuffer` Buffer object - Buffer to copy into
|
|
|
|
* `targetStart` Number, Optional, Default: 0
|
|
|
|
* `sourceStart` Number, Optional, Default: 0
|
|
|
|
* `sourceEnd` Number, Optional, Default: `buffer.length`
|
|
|
|
|
|
|
|
Copies data from a region of this Buffer to a region in the target Buffer even
|
|
|
|
if the target memory region overlaps with the source. If `undefined`, the
|
|
|
|
`targetStart` and `sourceStart` parameters default to `0` while `sourceEnd`
|
|
|
|
defaults to `buffer.length`.
|
|
|
|
|
|
|
|
Returns the number of bytes copied.
|
|
|
|
|
|
|
|
Example: build two Buffers, then copy `buf1` from byte 16 through byte 19
|
|
|
|
into `buf2`, starting at the 8th byte in `buf2`.
|
|
|
|
|
|
|
|
const buf1 = new Buffer(26);
|
|
|
|
const buf2 = new Buffer(26).fill('!');
|
|
|
|
|
|
|
|
for (var i = 0 ; i < 26 ; i++) {
|
|
|
|
buf1[i] = i + 97; // 97 is ASCII a
|
|
|
|
}
|
|
|
|
|
|
|
|
buf1.copy(buf2, 8, 16, 20);
|
|
|
|
console.log(buf2.toString('ascii', 0, 25));
|
|
|
|
// Prints: !!!!!!!!qrst!!!!!!!!!!!!!
|
|
|
|
|
|
|
|
Example: Build a single Buffer, then copy data from one region to an overlapping
|
|
|
|
region in the same Buffer
|
|
|
|
|
|
|
|
const buf = new Buffer(26);
|
|
|
|
|
|
|
|
for (var i = 0 ; i < 26 ; i++) {
|
|
|
|
buf[i] = i + 97; // 97 is ASCII a
|
|
|
|
}
|
|
|
|
|
|
|
|
buf.copy(buf, 0, 4, 10);
|
|
|
|
console.log(buf.toString());
|
|
|
|
|
|
|
|
// efghijghijklmnopqrstuvwxyz
|
|
|
|
|
|
|
|
### buf.equals(otherBuffer)
|
|
|
|
|
|
|
|
* `otherBuffer` {Buffer}
|
|
|
|
|
|
|
|
Returns a boolean indicating whether `this` and `otherBuffer` have exactly the
|
|
|
|
same bytes.
|
|
|
|
|
|
|
|
const buf1 = new Buffer('ABC');
|
|
|
|
const buf2 = new Buffer('414243', 'hex');
|
|
|
|
const buf3 = new Buffer('ABCD');
|
|
|
|
|
|
|
|
console.log(buf1.equals(buf2));
|
|
|
|
// Prints: true
|
|
|
|
console.log(buf1.equals(buf3));
|
|
|
|
// Prints: false
|
|
|
|
|
|
|
|
### buf.fill(value[, offset][, end])
|
|
|
|
|
|
|
|
* `value`
|
|
|
|
* `offset` Number, Optional
|
|
|
|
* `end` Number, Optional
|
|
|
|
|
|
|
|
Fills the Buffer with the specified value. If the `offset` (defaults to `0`)
|
|
|
|
and `end` (defaults to `buffer.length`) are not given it will fill the entire
|
|
|
|
Buffer. The method returns a reference to the Buffer so calls can be chained.
|
|
|
|
|
|
|
|
const b = new Buffer(50).fill('h');
|
|
|
|
console.log(b.toString());
|
|
|
|
// Prints: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
|
|
|
|
|
|
|
|
### buf.indexOf(value[, byteOffset])
|
|
|
|
|
|
|
|
* `value` String, Buffer or Number
|
|
|
|
* `byteOffset` Number, Optional, Default: 0
|
|
|
|
* Return: Number
|
|
|
|
|
|
|
|
Operates similar to [`Array#indexOf()`][] in that it returns either the
|
|
|
|
starting index position of `value` in Buffer or `-1` if the Buffer does not
|
|
|
|
contain `value`. The `value` can be a String, Buffer or Number. Strings are
|
|
|
|
interpreted as UTF8. Buffers will use the entire Buffer (to compare a partial
|
|
|
|
Buffer use [`Buffer#slice()`][]). Numbers can range from 0 to 255.
|
|
|
|
|
|
|
|
const buf = new Buffer('this is a buffer');
|
|
|
|
|
|
|
|
buf.indexOf('this');
|
|
|
|
// returns 0
|
|
|
|
buf.indexOf('is');
|
|
|
|
// returns 2
|
|
|
|
buf.indexOf(new Buffer('a buffer'));
|
|
|
|
// returns 8
|
|
|
|
buf.indexOf(97); // ascii for 'a'
|
|
|
|
// returns 8
|
|
|
|
buf.indexOf(new Buffer('a buffer example'));
|
|
|
|
// returns -1
|
|
|
|
buf.indexOf(new Buffer('a buffer example').slice(0,8));
|
|
|
|
// returns 8
|
|
|
|
|
|
|
|
### buf.includes(value[, byteOffset][, encoding])
|
|
|
|
|
|
|
|
* `value` String, Buffer or Number
|
|
|
|
* `byteOffset` Number, Optional, Default: 0
|
|
|
|
* `encoding` String, Optional, Default: 'utf8'
|
|
|
|
|
|
|
|
Operates similar to [Array#includes()][]. The `value` can be a String, Buffer
|
|
|
|
or Number. Strings are interpreted as UTF8 unless overridden with the
|
|
|
|
`encoding` argument. Buffers will use the entire Buffer (to compare a partial Buffer use `Buffer#slice()`). Numbers can range from 0 to 255.
|
|
|
|
|
|
|
|
The `byteOffset` indicates the index in `buf` where searching begins.
|
|
|
|
|
|
|
|
const buf = new Buffer('this is a buffer');
|
|
|
|
|
|
|
|
buf.includes('this');
|
|
|
|
// returns true
|
|
|
|
buf.includes('is');
|
|
|
|
// returns true
|
|
|
|
buf.includes(new Buffer('a buffer'));
|
|
|
|
// returns true
|
|
|
|
buf.includes(97); // ascii for 'a'
|
|
|
|
// returns true
|
|
|
|
buf.includes(new Buffer('a buffer example'));
|
|
|
|
// returns false
|
|
|
|
buf.includes(new Buffer('a buffer example').slice(0,8));
|
|
|
|
// returns true
|
|
|
|
buf.includes('this', 4);
|
|
|
|
// returns false
|
|
|
|
|
|
|
|
### buf.length
|
|
|
|
|
|
|
|
* Number
|
|
|
|
|
|
|
|
Returns the amount of memory allocated for the Buffer in number of bytes. Note
|
|
|
|
that this does not necessarily reflect the amount of usable data within the
|
|
|
|
Buffer. For instance, in the example below, a Buffer with 1234 bytes is
|
|
|
|
allocated, but only 11 ASCII bytes are written.
|
|
|
|
|
|
|
|
const buf = new Buffer(1234);
|
|
|
|
|
|
|
|
console.log(buf.length);
|
|
|
|
// Prints: 1234
|
|
|
|
|
|
|
|
buf.write('some string', 0, 'ascii');
|
|
|
|
console.log(buf.length);
|
|
|
|
// Prints: 1234
|
|
|
|
|
|
|
|
While the `length` property is not immutable, changing the value of `length`
|
|
|
|
can result in undefined and inconsistent behavior. Applications that wish to
|
|
|
|
modify the length of a Buffer should therefore treat `length` as read-only and
|
|
|
|
use [`buf.slice`][] to create a new Buffer.
|
|
|
|
|
|
|
|
const buf = new Buffer(10);
|
|
|
|
buf.write('abcdefghj', 0, 'ascii');
|
|
|
|
console.log(buf.length);
|
|
|
|
// Prints: 10
|
|
|
|
buf = buf.slice(0,5);
|
|
|
|
console.log(buf.length);
|
|
|
|
// Prints: 5
|
|
|
|
|
|
|
|
### buf.readDoubleBE(offset[, noAssert])
|
|
|
|
### buf.readDoubleLE(offset[, noAssert])
|
|
|
|
|
|
|
|
* `offset` Number
|
|
|
|
* `noAssert` Boolean, Optional, Default: false
|
|
|
|
* Return: Number
|
|
|
|
|
|
|
|
Reads a 64-bit double from the Buffer at the specified `offset` with specified
|
|
|
|
endian format (`readDoubleBE()` returns big endian, `readDoubleLE()` returns
|
|
|
|
little endian).
|
|
|
|
|
|
|
|
Setting `noAssert` to `true` skips validation of the `offset`. This allows the
|
|
|
|
`offset` to be beyond the end of the Buffer. When not specified, `noAssert`
|
|
|
|
defaults to `false`.
|
|
|
|
|
|
|
|
const buf = new Buffer([1,2,3,4,5,6,7,8]);
|
|
|
|
|
|
|
|
buf.readDoubleBE();
|
|
|
|
// Returns: 8.20788039913184e-304
|
|
|
|
buf.readDoubleLE();
|
|
|
|
// Returns: 5.447603722011605e-270
|
|
|
|
buf.readDoubleLE(1);
|
|
|
|
// throws RangeError: Index out of range
|
|
|
|
|
|
|
|
buf.readDoubleLE(1, true); // Warning: reads passed end of buffer!
|
|
|
|
// Segmentation fault! don't do this!
|
|
|
|
|
|
|
|
### buf.readFloatBE(offset[, noAssert])
|
|
|
|
### buf.readFloatLE(offset[, noAssert])
|
|
|
|
|
|
|
|
* `offset` Number
|
|
|
|
* `noAssert` Boolean, Optional, Default: false
|
|
|
|
* Return: Number
|
|
|
|
|
|
|
|
Reads a 32-bit float from the Buffer at the specified `offset` with specified
|
|
|
|
endian format (`readFloatBE()` returns big endian, `readFloatLE()` returns
|
|
|
|
little endian).
|
|
|
|
|
|
|
|
Setting `noAssert` to `true` skips validation of the `offset`. This allows the
|
|
|
|
`offset` to be beyond the end of the Buffer. When not specified, `noAssert`
|
|
|
|
defaults to `false`.
|
|
|
|
|
|
|
|
const buf = new Buffer([1,2,3,4]);
|
|
|
|
|
|
|
|
buf.readFloatBE();
|
|
|
|
// Returns: 2.387939260590663e-38
|
|
|
|
buf.readFloatLE();
|
|
|
|
// Returns: 1.539989614439558e-36
|
|
|
|
buf.readFloatLE(1);
|
|
|
|
// throws RangeError: Index out of range
|
|
|
|
|
|
|
|
buf.readFloatLE(1, true); // Warning: reads passed end of buffer!
|
|
|
|
// Segmentation fault! don't do this!
|
|
|
|
|
|
|
|
### buf.readInt8(offset[, noAssert])
|
|
|
|
|
|
|
|
* `offset` Number
|
|
|
|
* `noAssert` Boolean, Optional, Default: false
|
|
|
|
* Return: Number
|
|
|
|
|
|
|
|
Reads a signed 8-bit integer from the Buffer at the specified `offset`.
|
|
|
|
|
|
|
|
Setting `noAssert` to `true` skips validation of the `offset`. This allows the
|
|
|
|
`offset` to be beyond the end of the Buffer. When not specified, `noAssert`
|
|
|
|
defaults to `false`.
|
|
|
|
|
|
|
|
Integers read from the Buffer are interpreted as two's complement signed values.
|
|
|
|
|
|
|
|
const buf = new Buffer([1,-2,3,4]);
|
|
|
|
|
|
|
|
buf.readInt8(0);
|
|
|
|
// returns 1
|
|
|
|
buf.readInt8(1);
|
|
|
|
// returns -2
|
|
|
|
|
|
|
|
### buf.readInt16BE(offset[, noAssert])
|
|
|
|
### buf.readInt16LE(offset[, noAssert])
|
|
|
|
|
|
|
|
* `offset` Number
|
|
|
|
* `noAssert` Boolean, Optional, Default: false
|
|
|
|
* Return: Number
|
|
|
|
|
|
|
|
Reads a signed 16-bit integer from the Buffer at the specified `offset` with
|
|
|
|
the specified endian format (`readInt16BE()` returns big endian,
|
|
|
|
`readInt16LE()` returns little endian).
|
|
|
|
|
|
|
|
Setting `noAssert` to `true` skips validation of the `offset`. This allows the
|
|
|
|
`offset` to be beyond the end of the Buffer. When not specified, `noAssert`
|
|
|
|
defaults to `false`.
|
|
|
|
|
|
|
|
Integers read from the Buffer are interpreted as two's complement signed values.
|
|
|
|
|
|
|
|
const buf = new Buffer([1,-2,3,4]);
|
|
|
|
|
|
|
|
buf.readInt16BE();
|
|
|
|
// returns 510
|
|
|
|
buf.readInt16LE(1);
|
|
|
|
// returns -511
|
|
|
|
|
|
|
|
### buf.readInt32BE(offset[, noAssert])
|
|
|
|
### buf.readInt32LE(offset[, noAssert])
|
|
|
|
|
|
|
|
* `offset` Number
|
|
|
|
* `noAssert` Boolean, Optional, Default: false
|
|
|
|
* Return: Number
|
|
|
|
|
|
|
|
Reads a signed 32-bit integer from the Buffer at the specified `offset` with
|
|
|
|
the specified endian format (`readInt32BE()` returns big endian,
|
|
|
|
`readInt32LE()` returns little endian).
|
|
|
|
|
|
|
|
Setting `noAssert` to `true` skips validation of the `offset`. This allows the
|
|
|
|
`offset` to be beyond the end of the Buffer. When not specified, `noAssert`
|
|
|
|
defaults to `false`.
|
|
|
|
|
|
|
|
Integers read from the Buffer are interpreted as two's complement signed values.
|
|
|
|
|
|
|
|
const buf = new Buffer([1,-2,3,4]);
|
|
|
|
|
|
|
|
buf.readInt32BE();
|
|
|
|
// returns 33424132
|
|
|
|
buf.readInt32LE(1);
|
|
|
|
// returns 67370497
|
|
|
|
|
|
|
|
### buf.readIntBE(offset, byteLength[, noAssert])
|
|
|
|
### buf.readIntLE(offset, byteLength[, noAssert])
|
|
|
|
|
|
|
|
* `offset` {Number} `0 <= offset <= buf.length`
|
|
|
|
* `byteLength` {Number} `0 < byteLength <= 6`
|
|
|
|
* `noAssert` {Boolean} Default: false
|
|
|
|
* Return: {Number}
|
|
|
|
|
|
|
|
Reads `byteLength` number of bytes from the Buffer at the specified `offset`
|
|
|
|
and interprets the result as a two's complement signed value. Supports up to 48
|
|
|
|
bits of accuracy. For example:
|
|
|
|
|
|
|
|
const buf = new Buffer(6);
|
|
|
|
buf.writeUInt16LE(0x90ab, 0);
|
|
|
|
buf.writeUInt32LE(0x12345678, 2);
|
|
|
|
buf.readIntLE(0, 6).toString(16); // Specify 6 bytes (48 bits)
|
|
|
|
// Returns: '1234567890ab'
|
|
|
|
|
|
|
|
buf.readIntBE(0, 6).toString(16);
|
|
|
|
// Returns: -546f87a9cbee
|
|
|
|
|
|
|
|
Setting `noAssert` to `true` skips validation of the `offset`. This allows the
|
|
|
|
`offset` to be beyond the end of the Buffer. When not specified, `noAssert`
|
|
|
|
defaults to `false`.
|
|
|
|
|
|
|
|
### buf.readUInt8(offset[, noAssert])
|
|
|
|
|
|
|
|
* `offset` Number
|
|
|
|
* `noAssert` Boolean, Optional, Default: false
|
|
|
|
* Return: Number
|
|
|
|
|
|
|
|
Reads an unsigned 8-bit integer from the Buffer at the specified `offset`.
|
|
|
|
|
|
|
|
Setting `noAssert` to `true` skips validation of the `offset`. This allows the
|
|
|
|
`offset` to be beyond the end of the Buffer. When not specified, `noAssert`
|
|
|
|
defaults to `false`.
|
|
|
|
|
|
|
|
const buf = new Buffer([1,-2,3,4]);
|
|
|
|
|
|
|
|
buf.readUInt8(0);
|
|
|
|
// returns 1
|
|
|
|
buf.readUInt8(1);
|
|
|
|
// returns 254
|
|
|
|
|
|
|
|
### buf.readUInt16BE(offset[, noAssert])
|
|
|
|
### buf.readUInt16LE(offset[, noAssert])
|
|
|
|
|
|
|
|
* `offset` Number
|
|
|
|
* `noAssert` Boolean, Optional, Default: false
|
|
|
|
* Return: Number
|
|
|
|
|
|
|
|
Reads an unsigned 16-bit integer from the Buffer at the specified `offset` with
|
|
|
|
specified endian format (`readInt32BE()` returns big endian,
|
|
|
|
`readInt32LE()` returns little endian).
|
|
|
|
|
|
|
|
Setting `noAssert` to `true` skips validation of the `offset`. This allows the
|
|
|
|
`offset` to be beyond the end of the Buffer. When not specified, `noAssert`
|
|
|
|
defaults to `false`.
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
|
|
|
const buf = new Buffer([0x3, 0x4, 0x23, 0x42]);
|
|
|
|
|
|
|
|
buf.readUInt16BE(0);
|
|
|
|
// Returns: 0x0304
|
|
|
|
buf.readUInt16LE(0);
|
|
|
|
// Returns: 0x0403
|
|
|
|
buf.readUInt16BE(1);
|
|
|
|
// Returns: 0x0423
|
|
|
|
buf.readUInt16LE(1);
|
|
|
|
// Returns: 0x2304
|
|
|
|
buf.readUInt16BE(2);
|
|
|
|
// Returns: 0x2342
|
|
|
|
buf.readUInt16LE(2);
|
|
|
|
// Returns: 0x4223
|
|
|
|
|
|
|
|
### buf.readUInt32BE(offset[, noAssert])
|
|
|
|
### buf.readUInt32LE(offset[, noAssert])
|
|
|
|
|
|
|
|
* `offset` Number
|
|
|
|
* `noAssert` Boolean, Optional, Default: false
|
|
|
|
* Return: Number
|
|
|
|
|
|
|
|
Reads an unsigned 32-bit integer from the Buffer at the specified `offset` with
|
|
|
|
specified endian format (`readInt32BE()` returns big endian,
|
|
|
|
`readInt32LE()` returns little endian).
|
|
|
|
|
|
|
|
Setting `noAssert` to `true` skips validation of the `offset`. This allows the
|
|
|
|
`offset` to be beyond the end of the Buffer. When not specified, `noAssert`
|
|
|
|
defaults to `false`.
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
|
|
|
const buf = new Buffer([0x3, 0x4, 0x23, 0x42]);
|
|
|
|
|
|
|
|
buf.readUInt32BE(0);
|
|
|
|
// Returns: 0x03042342
|
|
|
|
console.log(buf.readUInt32LE(0));
|
|
|
|
// Returns: 0x42230403
|
|
|
|
|
|
|
|
### buf.readUIntBE(offset, byteLength[, noAssert])
|
|
|
|
### buf.readUIntLE(offset, byteLength[, noAssert])
|
|
|
|
|
|
|
|
* `offset` {Number} `0 <= offset <= buf.length`
|
|
|
|
* `byteLength` {Number} `0 < byteLength <= 6`
|
|
|
|
* `noAssert` {Boolean} Default: false
|
|
|
|
* Return: {Number}
|
|
|
|
|
|
|
|
Reads `byteLength` number of bytes from the Buffer at the specified `offset`
|
|
|
|
and interprets the result as an unsigned integer. Supports up to 48
|
|
|
|
bits of accuracy. For example:
|
|
|
|
|
|
|
|
const buf = new Buffer(6);
|
|
|
|
buf.writeUInt16LE(0x90ab, 0);
|
|
|
|
buf.writeUInt32LE(0x12345678, 2);
|
|
|
|
buf.readUIntLE(0, 6).toString(16); // Specify 6 bytes (48 bits)
|
|
|
|
// Returns: '1234567890ab'
|
|
|
|
|
|
|
|
buf.readUIntBE(0, 6).toString(16);
|
|
|
|
// Returns: ab9078563412
|
|
|
|
|
|
|
|
Setting `noAssert` to `true` skips validation of the `offset`. This allows the
|
|
|
|
`offset` to be beyond the end of the Buffer. When not specified, `noAssert`
|
|
|
|
defaults to `false`.
|
|
|
|
|
|
|
|
### buf.slice([start[, end]])
|
|
|
|
|
|
|
|
* `start` Number, Optional, Default: 0
|
|
|
|
* `end` Number, Optional, Default: `buffer.length`
|
|
|
|
|
|
|
|
Returns a new Buffer that references the same memory as the original, but offset
|
|
|
|
and cropped by the `start` (defaults to `0`) and `end` (defaults to
|
|
|
|
`buffer.length`) indexes.
|
|
|
|
|
|
|
|
**Note that modifying the new Buffer slice will modify the memory in the original Buffer because the allocated memory of the two objects overlap.**
|
|
|
|
|
|
|
|
Example: build a Buffer with the ASCII alphabet, take a slice, then modify one
|
|
|
|
byte from the original Buffer.
|
|
|
|
|
|
|
|
const buf1 = new Buffer(26);
|
|
|
|
|
|
|
|
for (var i = 0 ; i < 26 ; i++) {
|
|
|
|
buf1[i] = i + 97; // 97 is ASCII a
|
|
|
|
}
|
|
|
|
|
|
|
|
const buf2 = buf1.slice(0, 3);
|
|
|
|
buf2.toString('ascii', 0, buf2.length);
|
|
|
|
// Returns: 'abc'
|
|
|
|
buf1[0] = 33;
|
|
|
|
buf2.toString('ascii', 0, buf2.length);
|
|
|
|
// Returns : '!bc'
|
|
|
|
|
|
|
|
Specifying negative indexes causes the slice to be generated relative to the
|
|
|
|
end of the Buffer rather than the beginning.
|
|
|
|
|
|
|
|
const buf = new Buffer('buffer');
|
|
|
|
|
|
|
|
buf.slice(-6, -1).toString();
|
|
|
|
// Returns 'buffe', equivalent to buf.slice(0, 5)
|
|
|
|
buf.slice(-6, -2).toString();
|
|
|
|
// Returns 'buff', equivalent to buf.slice(0, 4)
|
|
|
|
buf.slice(-5, -2).toString();
|
|
|
|
// Returns 'uff', equivalent to buf.slice(1, 4)
|
|
|
|
|
|
|
|
### buf.toString([encoding][, start][, end])
|
|
|
|
|
|
|
|
* `encoding` String, Optional, Default: 'utf8'
|
|
|
|
* `start` Number, Optional, Default: 0
|
|
|
|
* `end` Number, Optional, Default: `buffer.length`
|
|
|
|
|
|
|
|
Decodes and returns a string from the Buffer data using the specified
|
|
|
|
character set `encoding`. If `encoding` is `undefined` or `null`, then
|
|
|
|
`encoding` defaults to `'utf8'`. The `start` and `end` parameters default to
|
|
|
|
`0` and `buffer.length` when `undefined`.
|
|
|
|
|
|
|
|
const buf = new Buffer(26);
|
|
|
|
for (var i = 0 ; i < 26 ; i++) {
|
|
|
|
buf[i] = i + 97; // 97 is ASCII a
|
|
|
|
}
|
|
|
|
buf.toString('ascii');
|
|
|
|
// Returns: 'abcdefghijklmnopqrstuvwxyz'
|
|
|
|
buf.toString('ascii',0,5);
|
|
|
|
// Returns: 'abcde'
|
|
|
|
buf.toString('utf8',0,5);
|
|
|
|
// Returns: 'abcde'
|
|
|
|
buf.toString(undefined,0,5);
|
|
|
|
// Returns: 'abcde', encoding defaults to 'utf8'
|
|
|
|
|
|
|
|
### buf.toJSON()
|
|
|
|
|
|
|
|
Returns a JSON representation of the Buffer instance. `JSON.stringify`
|
|
|
|
implicitly calls this function when stringifying a Buffer instance.
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
|
|
|
const buf = new Buffer('test');
|
|
|
|
const json = JSON.stringify(buf);
|
|
|
|
|
|
|
|
console.log(json);
|
|
|
|
// Prints: '{"type":"Buffer","data":[116,101,115,116]}'
|
|
|
|
|
|
|
|
const copy = JSON.parse(json, (key, value) => {
|
|
|
|
return value && value.type === 'Buffer'
|
|
|
|
? new Buffer(value.data)
|
|
|
|
: value;
|
|
|
|
});
|
|
|
|
|
|
|
|
console.log(copy.toString());
|
|
|
|
// Prints: 'test'
|
|
|
|
|
|
|
|
### buf.write(string[, offset][, length][, encoding])
|
|
|
|
|
|
|
|
* `string` String - data to be written to buffer
|
|
|
|
* `offset` Number, Optional, Default: 0
|
|
|
|
* `length` Number, Optional, Default: `buffer.length - offset`
|
|
|
|
* `encoding` String, Optional, Default: 'utf8'
|
|
|
|
|
|
|
|
Writes `string` to the Buffer at `offset` using the given `encoding`.
|
|
|
|
When undefined, `offset` defaults to `0`, and `encoding` defaults to `'utf8'`.
|
|
|
|
The `length` parameter is the number of bytes to write, when undefined `length`
|
|
|
|
defaults to `buffer.length - offset`. If the Buffer did not contain enough
|
|
|
|
space to fit the entire string, only a partial amount of the string will be
|
|
|
|
written however, the will not write only partially encoded characters. The
|
|
|
|
return value indicates the number of octets written.
|
|
|
|
|
|
|
|
const buf = new Buffer(256);
|
|
|
|
const len = buf.write('\u00bd + \u00bc = \u00be', 0);
|
|
|
|
console.log(`${len} bytes: ${buf.toString('utf8', 0, len)}`);
|
|
|
|
// Prints: 12 bytes: ½ + ¼ = ¾
|
|
|
|
|
|
|
|
### buf.writeDoubleBE(value, offset[, noAssert])
|
|
|
|
### buf.writeDoubleLE(value, offset[, noAssert])
|
|
|
|
|
|
|
|
* `value` Number
|
|
|
|
* `offset` Number
|
|
|
|
* `noAssert` Boolean, Optional, Default: false
|
|
|
|
|
|
|
|
Writes `value` to the Buffer at the specified `offset` with specified endian
|
|
|
|
format (`writeDoubleBE()` writes big endian, `writeDoubleLE()` writes little
|
|
|
|
endian). The `value` argument must be a valid 64-bit double.
|
|
|
|
|
|
|
|
Set `noAssert` to true to skip validation of `value` and `offset`. This means
|
|
|
|
that `value` may be too large for the specific function and `offset` may be
|
|
|
|
beyond the end of the Buffer leading to the values being silently dropped. This
|
|
|
|
should not be used unless you are certain of correctness. Defaults to `false`.
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
|
|
|
const buf = new Buffer(8);
|
|
|
|
buf.writeDoubleBE(0xdeadbeefcafebabe, 0);
|
|
|
|
|
|
|
|
console.log(buf);
|
|
|
|
// Prints: <Buffer 43 eb d5 b7 dd f9 5f d7>
|
|
|
|
|
|
|
|
buf.writeDoubleLE(0xdeadbeefcafebabe, 0);
|
|
|
|
|
|
|
|
console.log(buf);
|
|
|
|
// Prints: <Buffer d7 5f f9 dd b7 d5 eb 43>
|
|
|
|
|
|
|
|
### buf.writeFloatBE(value, offset[, noAssert])
|
|
|
|
### buf.writeFloatLE(value, offset[, noAssert])
|
|
|
|
|
|
|
|
* `value` Number
|
|
|
|
* `offset` Number
|
|
|
|
* `noAssert` Boolean, Optional, Default: false
|
|
|
|
|
|
|
|
Writes `value` to the Buffer at the specified `offset` with specified endian
|
|
|
|
format (`writeFloatBE()` writes big endian, `writeFloatLE()` writes little
|
|
|
|
endian). Behavior is unspecified if `value` is anything other than a 32-bit
|
|
|
|
float.
|
|
|
|
|
|
|
|
Set `noAssert` to true to skip validation of `value` and `offset`. This means
|
|
|
|
that `value` may be too large for the specific function and `offset` may be
|
|
|
|
beyond the end of the Buffer leading to the values being silently dropped. This
|
|
|
|
should not be used unless you are certain of correctness. Defaults to `false`.
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
|
|
|
const buf = new Buffer(4);
|
|
|
|
buf.writeFloatBE(0xcafebabe, 0);
|
|
|
|
|
|
|
|
console.log(buf);
|
|
|
|
// Prints: <Buffer 4f 4a fe bb>
|
|
|
|
|
|
|
|
buf.writeFloatLE(0xcafebabe, 0);
|
|
|
|
|
|
|
|
console.log(buf);
|
|
|
|
// Prints: <Buffer bb fe 4a 4f>
|
|
|
|
|
|
|
|
### buf.writeInt8(value, offset[, noAssert])
|
|
|
|
|
|
|
|
* `value` Number
|
|
|
|
* `offset` Number
|
|
|
|
* `noAssert` Boolean, Optional, Default: false
|
|
|
|
|
|
|
|
Writes `value` to the Buffer at the specified `offset`. The `value` must be a
|
|
|
|
valid signed 8-bit integer.
|
|
|
|
|
|
|
|
Set `noAssert` to true to skip validation of `value` and `offset`. This means
|
|
|
|
that `value` may be too large for the specific function and `offset` may be
|
|
|
|
beyond the end of the Buffer leading to the values being silently dropped. This
|
|
|
|
should not be used unless you are certain of correctness. Defaults to `false`.
|
|
|
|
|
|
|
|
The `value` is interpreted and written as a two's complement signed integer.
|
|
|
|
|
|
|
|
const buf = new Buffer(2);
|
|
|
|
buf.writeInt8(2, 0);
|
|
|
|
buf.writeInt8(-2, 1);
|
|
|
|
console.log(buf);
|
|
|
|
// Prints: <Buffer 02 fe>
|
|
|
|
|
|
|
|
### buf.writeInt16BE(value, offset[, noAssert])
|
|
|
|
### buf.writeInt16LE(value, offset[, noAssert])
|
|
|
|
|
|
|
|
* `value` Number
|
|
|
|
* `offset` Number
|
|
|
|
* `noAssert` Boolean, Optional, Default: false
|
|
|
|
|
|
|
|
Writes `value` to the Buffer at the specified `offset` with specified endian
|
|
|
|
format (`writeInt16BE()` writes big endian, `writeInt16LE()` writes little
|
|
|
|
endian). The `value` must be a valid signed 16-bit integer.
|
|
|
|
|
|
|
|
Set `noAssert` to true to skip validation of `value` and `offset`. This means
|
|
|
|
that `value` may be too large for the specific function and `offset` may be
|
|
|
|
beyond the end of the Buffer leading to the values being silently dropped. This
|
|
|
|
should not be used unless you are certain of correctness. Defaults to `false`.
|
|
|
|
|
|
|
|
The `value` is interpreted and written as a two's complement signed integer.
|
|
|
|
|
|
|
|
const buf = new Buffer(4);
|
|
|
|
buf.writeInt16BE(0x0102,0);
|
|
|
|
buf.writeInt16LE(0x0304,2);
|
|
|
|
console.log(buf);
|
|
|
|
// Prints: <Buffer 01 02 04 03>
|
|
|
|
|
|
|
|
### buf.writeInt32BE(value, offset[, noAssert])
|
|
|
|
### buf.writeInt32LE(value, offset[, noAssert])
|
|
|
|
|
|
|
|
* `value` Number
|
|
|
|
* `offset` Number
|
|
|
|
* `noAssert` Boolean, Optional, Default: false
|
|
|
|
|
|
|
|
Writes `value` to the Buffer at the specified `offset` with specified endian
|
|
|
|
format (`writeInt32BE()` writes big endian, `writeInt32LE()` writes little
|
|
|
|
endian). The `value` must be a valid signed 32-bit integer.
|
|
|
|
|
|
|
|
Set `noAssert` to true to skip validation of `value` and `offset`. This means
|
|
|
|
that `value` may be too large for the specific function and `offset` may be
|
|
|
|
beyond the end of the Buffer leading to the values being silently dropped. This
|
|
|
|
should not be used unless you are certain of correctness. Defaults to `false`.
|
|
|
|
|
|
|
|
The `value` is interpreted and written as a two's complement signed integer.
|
|
|
|
|
|
|
|
const buf = new Buffer(8);
|
|
|
|
buf.writeInt32BE(0x01020304,0);
|
|
|
|
buf.writeInt32LE(0x05060708,4);
|
|
|
|
console.log(buf);
|
|
|
|
// Prints: <Buffer 01 02 03 04 08 07 06 05>
|
|
|
|
|
|
|
|
### buf.writeIntBE(value, offset, byteLength[, noAssert])
|
|
|
|
### buf.writeIntLE(value, offset, byteLength[, noAssert])
|
|
|
|
|
|
|
|
* `value` {Number} Bytes to be written to Buffer
|
|
|
|
* `offset` {Number} `0 <= offset <= buf.length`
|
|
|
|
* `byteLength` {Number} `0 < byteLength <= 6`
|
|
|
|
* `noAssert` {Boolean} Default: false
|
|
|
|
* Return: {Number}
|
|
|
|
|
|
|
|
Writes `value` to the Buffer at the specified `offset` and `byteLength`.
|
|
|
|
Supports up to 48 bits of accuracy. For example:
|
|
|
|
|
|
|
|
const buf1 = new Buffer(6);
|
|
|
|
buf1.writeUIntBE(0x1234567890ab, 0, 6);
|
|
|
|
console.log(buf1);
|
|
|
|
// Prints: <Buffer 12 34 56 78 90 ab>
|
|
|
|
|
|
|
|
const buf2 = new Buffer(6);
|
|
|
|
buf2.writeUIntLE(0x1234567890ab, 0, 6);
|
|
|
|
console.log(buf2);
|
|
|
|
// Prints: <Buffer ab 90 78 56 34 12>
|
|
|
|
|
|
|
|
Set `noAssert` to true to skip validation of `value` and `offset`. This means
|
|
|
|
that `value` may be too large for the specific function and `offset` may be
|
|
|
|
beyond the end of the Buffer leading to the values being silently dropped. This
|
|
|
|
should not be used unless you are certain of correctness. Defaults to `false`.
|
|
|
|
|
|
|
|
### buf.writeUInt8(value, offset[, noAssert])
|
|
|
|
|
|
|
|
* `value` Number
|
|
|
|
* `offset` Number
|
|
|
|
* `noAssert` Boolean, Optional, Default: false
|
|
|
|
|
|
|
|
Writes `value` to the Buffer at the specified `offset`. The `value` must be a
|
|
|
|
valid unsigned 8-bit integer.
|
|
|
|
|
|
|
|
Set `noAssert` to true to skip validation of `value` and `offset`. This means
|
|
|
|
that `value` may be too large for the specific function and `offset` may be
|
|
|
|
beyond the end of the Buffer leading to the values being silently dropped. This
|
|
|
|
should not be used unless you are certain of correctness. Defaults to `false`.
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
|
|
|
const buf = new Buffer(4);
|
|
|
|
buf.writeUInt8(0x3, 0);
|
|
|
|
buf.writeUInt8(0x4, 1);
|
|
|
|
buf.writeUInt8(0x23, 2);
|
|
|
|
buf.writeUInt8(0x42, 3);
|
|
|
|
|
|
|
|
console.log(buf);
|
|
|
|
// Prints: <Buffer 03 04 23 42>
|
|
|
|
|
|
|
|
### buf.writeUInt16BE(value, offset[, noAssert])
|
|
|
|
### buf.writeUInt16LE(value, offset[, noAssert])
|
|
|
|
|
|
|
|
* `value` Number
|
|
|
|
* `offset` Number
|
|
|
|
* `noAssert` Boolean, Optional, Default: false
|
|
|
|
|
|
|
|
Writes `value` to the Buffer at the specified `offset` with specified endian
|
|
|
|
format (`writeUInt16BE()` writes big endian, `writeUInt16LE()` writes little
|
|
|
|
endian). The `value` must be a valid unsigned 16-bit integer.
|
|
|
|
|
|
|
|
Set `noAssert` to true to skip validation of `value` and `offset`. This means
|
|
|
|
that `value` may be too large for the specific function and `offset` may be
|
|
|
|
beyond the end of the Buffer leading to the values being silently dropped. This
|
|
|
|
should not be used unless you are certain of correctness. Defaults to `false`.
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
|
|
|
const buf = new Buffer(4);
|
|
|
|
buf.writeUInt16BE(0xdead, 0);
|
|
|
|
buf.writeUInt16BE(0xbeef, 2);
|
|
|
|
|
|
|
|
console.log(buf);
|
|
|
|
// Prints: <Buffer de ad be ef>
|
|
|
|
|
|
|
|
buf.writeUInt16LE(0xdead, 0);
|
|
|
|
buf.writeUInt16LE(0xbeef, 2);
|
|
|
|
|
|
|
|
console.log(buf);
|
|
|
|
// Prints: <Buffer ad de ef be>
|
|
|
|
|
|
|
|
### buf.writeUInt32BE(value, offset[, noAssert])
|
|
|
|
### buf.writeUInt32LE(value, offset[, noAssert])
|
|
|
|
|
|
|
|
* `value` Number
|
|
|
|
* `offset` Number
|
|
|
|
* `noAssert` Boolean, Optional, Default: false
|
|
|
|
|
|
|
|
Writes `value` to the Buffer at the specified `offset` with specified endian
|
|
|
|
format (`writeUInt32BE()` writes big endian, `writeUInt32LE()` writes little
|
|
|
|
endian). The `value` must be a valid unsigned 32-bit integer.
|
|
|
|
|
|
|
|
Set `noAssert` to true to skip validation of `value` and `offset`. This means
|
|
|
|
that `value` may be too large for the specific function and `offset` may be
|
|
|
|
beyond the end of the Buffer leading to the values being silently dropped. This
|
|
|
|
should not be used unless you are certain of correctness. Defaults to `false`.
|
|
|
|
|
|
|
|
Example:
|
|
|
|
|
|
|
|
const buf = new Buffer(4);
|
|
|
|
buf.writeUInt32BE(0xfeedface, 0);
|
|
|
|
|
|
|
|
console.log(buf);
|
|
|
|
// Prints: <Buffer fe ed fa ce>
|
|
|
|
|
|
|
|
buf.writeUInt32LE(0xfeedface, 0);
|
|
|
|
|
|
|
|
console.log(buf);
|
|
|
|
// Prints: <Buffer ce fa ed fe>
|
|
|
|
|
|
|
|
### buf.writeUIntBE(value, offset, byteLength[, noAssert])
|
|
|
|
### buf.writeUIntLE(value, offset, byteLength[, noAssert])
|
|
|
|
|
|
|
|
* `value` {Number} Bytes to be written to Buffer
|
|
|
|
* `offset` {Number} `0 <= offset <= buf.length`
|
|
|
|
* `byteLength` {Number} `0 < byteLength <= 6`
|
|
|
|
* `noAssert` {Boolean} Default: false
|
|
|
|
* Return: {Number}
|
|
|
|
|
|
|
|
Writes `value` to the Buffer at the specified `offset` and `byteLength`.
|
|
|
|
Supports up to 48 bits of accuracy. For example:
|
|
|
|
|
|
|
|
const buf = new Buffer(6);
|
|
|
|
buf.writeUIntBE(0x1234567890ab, 0, 6);
|
|
|
|
console.log(buf);
|
|
|
|
// Prints: <Buffer 12 34 56 78 90 ab>
|
|
|
|
|
|
|
|
Set `noAssert` to true to skip validation of `value` and `offset`. This means
|
|
|
|
that `value` may be too large for the specific function and `offset` may be
|
|
|
|
beyond the end of the Buffer leading to the values being silently dropped. This
|
|
|
|
should not be used unless you are certain of correctness. Defaults to `false`.
|
|
|
|
|
|
|
|
## buffer.INSPECT_MAX_BYTES
|
|
|
|
|
|
|
|
* Number, Default: 50
|
|
|
|
|
|
|
|
Returns the maximum number of bytes that will be returned when
|
|
|
|
`buffer.inspect()` is called. This can be overridden by user modules. See
|
|
|
|
[`util.inspect()`][] for more details on `buffer.inspect()` behavior.
|
|
|
|
|
|
|
|
Note that this is a property on the `buffer` module as returned by
|
|
|
|
`require('buffer')`, not on the Buffer global or a Buffer instance.
|
|
|
|
|
|
|
|
## Class: SlowBuffer
|
|
|
|
|
|
|
|
Returns an un-pooled `Buffer`.
|
|
|
|
|
|
|
|
In order to avoid the garbage collection overhead of creating many individually
|
|
|
|
allocated Buffers, by default allocations under 4KB are sliced from a single
|
|
|
|
larger allocated object. This approach improves both performance and memory
|
|
|
|
usage since v8 does not need to track and cleanup as many `Persistent` objects.
|
|
|
|
|
|
|
|
In the case where a developer may need to retain a small chunk of memory from a
|
|
|
|
pool for an indeterminate amount of time, it may be appropriate to create an
|
|
|
|
un-pooled Buffer instance using `SlowBuffer` then copy out the relevant bits.
|
|
|
|
|
|
|
|
// need to keep around a few small chunks of memory
|
|
|
|
const store = [];
|
|
|
|
|
|
|
|
socket.on('readable', () => {
|
|
|
|
var data = socket.read();
|
|
|
|
// allocate for retained data
|
|
|
|
var sb = new SlowBuffer(10);
|
|
|
|
// copy the data into the new allocation
|
|
|
|
data.copy(sb, 0, 0, 10);
|
|
|
|
store.push(sb);
|
|
|
|
});
|
|
|
|
|
|
|
|
Use of `SlowBuffer` should be used only as a last resort *after* a developer
|
|
|
|
has observed undue memory retention in their applications.
|
|
|
|
|
|
|
|
[iterator]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols
|
|
|
|
[`Array#indexOf()`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf
|
|
|
|
[Array#includes()]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes
|
|
|
|
[`buf.fill(0)`]: #buffer_buf_fill_value_offset_end
|
|
|
|
[`buf.slice`]: #buffer_buf_slice_start_end
|
|
|
|
[`buf1.compare(buf2)`]: #buffer_buf_compare_otherbuffer
|
|
|
|
[`Buffer#slice()`]: #buffer_buf_slice_start_end
|
|
|
|
[`RangeError`]: errors.html#errors_class_rangeerror
|
|
|
|
[`String.prototype.length`]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/length
|
|
|
|
[`util.inspect()`]: util.html#util_util_inspect_object_options
|