?
This document uses PHP Chinese website manual Release
穩(wěn)定性: 3 - 穩(wěn)定
純 Javascript 語(yǔ)言對(duì) Unicode 友好,但是難以處理二進(jìn)制數(shù)據(jù)。在處理 TCP 流和文件系統(tǒng)時(shí)經(jīng)常需要操作字節(jié)流。Node 提供了一些機(jī)制,用于操作、創(chuàng)建、以及消耗字節(jié)流。
在 Buffer 類實(shí)例化中存儲(chǔ)了原始數(shù)據(jù)。 Buffer 類似于一個(gè)整數(shù)數(shù)組,在 V8 堆(the V8 heap)原始存儲(chǔ)空間給它分配了內(nèi)存。一旦創(chuàng)建了 Buffer 實(shí)例,則無(wú)法改變大小。
Buffer
類是全局對(duì)象,所以訪問(wèn)它不必使用 require('buffer')
。
Buffers 和 Javascript 字符串對(duì)象之間轉(zhuǎn)換時(shí)需要一個(gè)明確的編碼方法。下面是字符串的不同編碼。
'ascii'
- 7位的 ASCII 數(shù)據(jù)。這種編碼方式非??欤鼤?huì)移除最高位內(nèi)容。
'utf8'
- 多字節(jié)編碼 Unicode 字符。大部分網(wǎng)頁(yè)和文檔使用這類編碼方式。
'utf16le'
- 2個(gè)或4個(gè)字節(jié), Little Endian (LE) 編碼 Unicode 字符。編碼范圍 (U+10000 到 U+10FFFF) 。
'ucs2'
- 'utf16le'
的子集。
'base64'
- Base64 字符編碼。
'binary'
- 僅使用每個(gè)字符的頭8位將原始的二進(jìn)制信息進(jìn)行編碼。在需使用 Buffer 的情況下,應(yīng)該盡量避免使用這個(gè)已經(jīng)過(guò)時(shí)的編碼方式。這個(gè)編碼方式將會(huì)在未來(lái)某個(gè)版本中棄用。
'hex'
- 每個(gè)字節(jié)都采用 2 進(jìn)制編碼。
在Buffer
中創(chuàng)建一個(gè)數(shù)組,需要注意以下規(guī)則:
Buffer 是內(nèi)存拷貝,而不是內(nèi)存共享。
Buffer 占用內(nèi)存被解釋為一個(gè)數(shù)組,而不是字節(jié)數(shù)組。比如,new Uint32Array(new Buffer([1,2,3,4]))
創(chuàng)建了4個(gè) Uint32Array
,它的成員為 [1,2,3,4]
,而不是[0x1020304]
或 [0x4030201]
。
注意:Node.js v0.8 只是簡(jiǎn)單的引用了array.buffer
里的 buffer ,而不是克隆(cloning)。
介紹一個(gè)高效的方法,ArrayBuffer#slice()
拷貝了一份切片,而 Buffer#slice()
新建了一份。
Buffer 類是全局變量類型,用來(lái)直接處理2進(jìn)制數(shù)據(jù)。 它能夠使用多種方式構(gòu)建。
size
Number 類型
分配一個(gè)新的 size
大小單位為8位字節(jié)的 buffer。 注意, size
必須小于kMaxLength,否則,將會(huì)拋出異常 RangeError
。
array
Array
使用一個(gè)8位字節(jié) array
數(shù)組分配一個(gè)新的 buffer。
buffer
{Buffer}
拷貝參數(shù) buffer
的數(shù)據(jù)到 Buffer
實(shí)例。
str
String 類型 - 需要編碼的字符串。
encoding
String 類型 - 編碼方式, 可選。
分配一個(gè)新的 buffer ,其中包含著傳入的 str
字符串。encoding
編碼方式默認(rèn)為 'utf8'
。
encoding
{String} 用來(lái)測(cè)試給定的編碼字符串
如果參數(shù)編碼 encoding
是有效的,返回 true,否則返回 false。
obj
對(duì)象
返回: Boolean
obj
如果是 Buffer
返回 true, 否則返回 false。
string
String 類型
encoding
String 類型, 可選, 默認(rèn): 'utf8'
返回: Number 類型
將會(huì)返回這個(gè)字符串真實(shí)字節(jié)長(zhǎng)度。 encoding 編碼默認(rèn)是:utf8
。 這和 String.prototype.length
不一樣,因?yàn)槟莻€(gè)方法返回這個(gè)字符串中字符的數(shù)量。
例如:
str = '\u00bd + \u00bc = \u00be'; console.log(str + ": " + str.length + " characters, " + Buffer.byteLength(str, 'utf8') + " bytes"); // ? + ? = ?: 9 characters, 12 bytes
list
{Array} 用來(lái)連接的數(shù)組
totalLength
{Number 類型} 數(shù)組里所有對(duì)象的總buffer大小
返回一個(gè)buffer對(duì)象,它將參數(shù) buffer 數(shù)組中所有 buffer 對(duì)象拼接在一起。
如果傳入的數(shù)組沒(méi)有內(nèi)容,或者 totalLength 是 0,那將返回一個(gè)長(zhǎng)度為 0 的buffer。
如果數(shù)組長(zhǎng)度為 1,返回?cái)?shù)組第一個(gè)成員。
如果數(shù)組長(zhǎng)度大于 0,將會(huì)創(chuàng)建一個(gè)新的 Buffer 實(shí)例。
如果沒(méi)有提供 totalLength 參數(shù),會(huì)根據(jù) buffer 數(shù)組計(jì)算,這樣會(huì)增加一個(gè)額外的循環(huán)計(jì)算,所以提供一個(gè)準(zhǔn)確的 totalLength 參數(shù)速度更快。
buf1
{Buffer}
buf2
{Buffer}
和 buf1.compare(buf2)
一樣。 用來(lái)對(duì)數(shù)組排序:
var arr = [Buffer('1234'), Buffer('0123')]; arr.sort(Buffer.compare);
Number 類型
返回這個(gè) buffer 的 bytes 數(shù)。注意這未必是 buffer 里面內(nèi)容的大小。length
是 buffer 對(duì)象所分配的內(nèi)存數(shù),它不會(huì)隨著這個(gè) buffer 對(duì)象內(nèi)容的改變而改變。
buf = new Buffer(1234); console.log(buf.length); buf.write("some string", 0, "ascii"); console.log(buf.length); // 1234 // 1234
length
不能改變,如果改變 length
將會(huì)導(dǎo)致不可以預(yù)期的結(jié)果。如果想要改變 buffer 的長(zhǎng)度,需要使用 buf.slice
來(lái)創(chuàng)建新的 buffer。
buf = new Buffer(10); buf.write("abcdefghj", 0, "ascii"); console.log(buf.length); // 10 buf = buf.slice(0,5); console.log(buf.length); // 5
string
String 類型 - 寫到 buffer 里
offset
Number 類型, 可選參數(shù), 默認(rèn)值: 0
length
Number 類型, 可選參數(shù), 默認(rèn)值: buffer.length - offset
encoding
String 類型, 可選參數(shù), 默認(rèn)值: 'utf8'
根據(jù)參數(shù) offset 偏移量和指定的 encoding 編碼方式,將參數(shù) string 數(shù)據(jù)寫入buffer。 offset 偏移量默認(rèn)值是 0, encoding 編碼方式默認(rèn)是 utf8
。 length 長(zhǎng)度是將要寫入的字符串的 bytes 大小。 返回 number 類型,表示寫入了多少 8 位字節(jié)流。如果 buffer 沒(méi)有足夠的空間來(lái)放整個(gè) string,它將只會(huì)只寫入部分字符串。 length 默認(rèn)是 buffer.length - offset。 這個(gè)方法不會(huì)出現(xiàn)寫入部分字符。
buf = new Buffer(256); len = buf.write('\u00bd + \u00bc = \u00be', 0); console.log(len + " bytes: " + buf.toString('utf8', 0, len));
value
{Number 類型} 準(zhǔn)備寫到 buffer 字節(jié)數(shù)
offset
{Number 類型} 0 <= offset <= buf.length
byteLength
{Number 類型} 0 < byteLength <= 6
noAssert
{Boolean} 默認(rèn)值: false
返回: {Number 類型}
將value
寫入到 buffer 里, 它由offset
和 byteLength
決定,支持 48 位計(jì)算,例如:
var b = new Buffer(6); b.writeUIntBE(0x1234567890ab, 0, 6); // <Buffer 12 34 56 78 90 ab>
noAssert
值為 true
時(shí),不再驗(yàn)證 value
和 offset
的有效性。 默認(rèn)是 false
。
offset
{Number 類型} 0 <= offset <= buf.length
byteLength
{Number 類型} 0 < byteLength <= 6
noAssert
{Boolean} 默認(rèn)值: false
返回: {Number 類型}
支持 48 位以下的數(shù)字讀取。 例如:
var b = new Buffer(6); b.writeUint16LE(0x90ab, 0); b.writeUInt32LE(0x12345678, 2); b.readUIntLE(0, 6).toString(16); // 指定為 6 bytes (48 bits) // 輸出: '1234567890ab'
noAssert
值為 true 時(shí), offset
不再驗(yàn)證是否超過(guò) buffer 的長(zhǎng)度,默認(rèn)為 false
。
encoding
String 類型, 可選參數(shù), 默認(rèn)值: 'utf8'
start
Number 類型, 可選參數(shù), 默認(rèn)值: 0
end
Number 類型, 可選參數(shù), 默認(rèn)值: buffer.length
根據(jù) encoding 參數(shù)(默認(rèn)是 'utf8')返回一個(gè)解碼過(guò)的 string 類型。還會(huì)根據(jù)傳入的參數(shù) start (默認(rèn)是 0) 和 end (默認(rèn)是 buffer.length)作為取值范圍。
buf = new Buffer(26); for (var i = 0 ; i < 26 ; i++) { buf[i] = i + 97; // 97 is ASCII a } buf.toString('ascii'); // 輸出: abcdefghijklmnopqrstuvwxyz buf.toString('ascii',0,5); // 輸出: abcde buf.toString('utf8',0,5); // 輸出: abcde buf.toString(undefined,0,5); // encoding defaults to 'utf8', 輸出 abcde
查看上面 buffer.write()
例子。
返回一個(gè) JSON 表示的 Buffer 實(shí)例。JSON.stringify
將會(huì)默認(rèn)調(diào)用字符串序列化這個(gè) Buffer 實(shí)例。
例如:
var buf = new Buffer('test'); var json = JSON.stringify(buf); console.log(json); // '{"type":"Buffer","data":[116,101,115,116]}' var copy = JSON.parse(json, function(key, value) { return value && value.type === 'Buffer' ? new Buffer(value.data) : value; }); console.log(copy); // <Buffer 74 65 73 74>
獲取或設(shè)置指定 index 位置的 8 位字節(jié)。這個(gè)值是指單個(gè)字節(jié),所以必須在合法的范圍取值,16 進(jìn)制的 0x00 到 0xFF,或者 0 到 255。
例如: 拷貝一個(gè) ASCII 編碼的 string 字符串到一個(gè) buffer, 一次一個(gè) byte 進(jìn)行拷貝:
str = "node.js"; buf = new Buffer(str.length); for (var i = 0; i < str.length ; i++) { buf[i] = str.charCodeAt(i); } console.log(buf); // node.js
otherBuffer
{Buffer}
如果 this
和 otherBuffer
擁有相同的內(nèi)容,返回 true。
otherBuffer
{Buffer}
返回一個(gè)數(shù)字,表示 this
在 otherBuffer
之前,之后或相同。
targetBuffer
Buffer 對(duì)象 - Buffer to copy into
targetStart
Number 類型, 可選參數(shù), 默認(rèn)值: 0
sourceStart
Number 類型, 可選參數(shù), 默認(rèn)值: 0
sourceEnd
Number 類型, 可選參數(shù), 默認(rèn)值: buffer.length
buffer 拷貝,源和目標(biāo)可以相同。 targetStart
目標(biāo)開始偏移和 sourceStart
源開始偏移默認(rèn)都是 0。 sourceEnd
源結(jié)束位置偏移默認(rèn)是源的長(zhǎng)度 buffer.length
。
例如:創(chuàng)建 2 個(gè)Buffer,然后把 buf1 的 16 到 19 位內(nèi)容拷貝到 buf2 第 8 位之后。
buf1 = new Buffer(26); buf2 = new Buffer(26); for (var i = 0 ; i < 26 ; i++) { buf1[i] = i + 97; // 97 is ASCII a buf2[i] = 33; // ASCII ! } buf1.copy(buf2, 8, 16, 20); console.log(buf2.toString('ascii', 0, 25)); // !!!!!!!!qrst!!!!!!!!!!!!!
例如: 在同一個(gè)buffer中,從一個(gè)區(qū)域拷貝到另一個(gè)區(qū)域
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
start
Number 類型, 可選參數(shù), 默認(rèn)值: 0
end
Number 類型, 可選參數(shù), 默認(rèn)值: buffer.length
返回一個(gè)新的buffer,這個(gè)buffer將會(huì)和老的buffer引用相同的內(nèi)存地址,根據(jù) start
(默認(rèn)是 0
) 和 end
(默認(rèn)是 buffer.length
) 偏移和裁剪了索引。 負(fù)的索引是從 buffer 尾部開始計(jì)算的。
修改這個(gè)新的 buffer 實(shí)例 slice 切片,也會(huì)改變?cè)瓉?lái)的 buffer!
例如: 創(chuàng)建一個(gè) ASCII 字母的 Buffer,進(jìn)行 slice 切片,然后修改源 Buffer 上的一個(gè) byte。
var buf1 = new Buffer(26); for (var i = 0 ; i < 26 ; i++) { buf1[i] = i + 97; // 97 is ASCII a } var buf2 = buf1.slice(0, 3); console.log(buf2.toString('ascii', 0, buf2.length)); buf1[0] = 33; console.log(buf2.toString('ascii', 0, buf2.length)); // abc // !bc
offset
Number 類型
noAssert
Boolean, 可選參數(shù), 默認(rèn)值: false
返回: Number 類型
從這個(gè) buffer 對(duì)象里,根據(jù)指定的偏移量,讀取一個(gè)有符號(hào) 8 位整數(shù) 整形。
若參數(shù) noAssert
為 true 將不會(huì)驗(yàn)證 offset
偏移量參數(shù)。 如果這樣 offset
可能會(huì)超出buffer 的末尾。默認(rèn)是 false
。
例如:
var buf = new Buffer(4); buf[0] = 0x3; buf[1] = 0x4; buf[2] = 0x23; buf[3] = 0x42; for (ii = 0; ii < buf.length; ii++) { console.log(buf.readUInt8(ii)); } // 0x3 // 0x4 // 0x23 // 0x42
offset
Number 類型
noAssert
Boolean, 可選參數(shù), 默認(rèn)值: false
返回: Number 類型
從 buffer 對(duì)象里,根據(jù)指定的偏移量,使用特殊的 endian 字節(jié)序格式讀取一個(gè)有符號(hào) 16 位整數(shù)。
若參數(shù) noAssert
為 true 將不會(huì)驗(yàn)證 offset
偏移量參數(shù)。 這意味著 offset
可能會(huì)超出 buffer 的末尾。默認(rèn)是 false
。
例如:
var buf = new Buffer(4); buf[0] = 0x3; buf[1] = 0x4; buf[2] = 0x23; buf[3] = 0x42; console.log(buf.readUInt16BE(0)); console.log(buf.readUInt16LE(0)); console.log(buf.readUInt16BE(1)); console.log(buf.readUInt16LE(1)); console.log(buf.readUInt16BE(2)); console.log(buf.readUInt16LE(2)); // 0x0304 // 0x0403 // 0x0423 // 0x2304 // 0x2342 // 0x4223
offset
Number 類型
noAssert
Boolean, 可選參數(shù), 默認(rèn)值: false
返回: Number 類型
從這個(gè) buffer 對(duì)象里,根據(jù)指定的偏移量,使用指定的 endian 字節(jié)序格式讀取一個(gè)有符號(hào) 32 位整數(shù)。
若參數(shù) noAssert
為 true 將不會(huì)驗(yàn)證 offset
偏移量參數(shù)。 這意味著 offset
可能會(huì)超出buffer 的末尾。默認(rèn)是 false
。
例如:
var buf = new Buffer(4); buf[0] = 0x3; buf[1] = 0x4; buf[2] = 0x23; buf[3] = 0x42; console.log(buf.readUInt32BE(0)); console.log(buf.readUInt32LE(0)); // 0x03042342 // 0x42230403
offset
Number 類型
noAssert
Boolean, 可選參數(shù), 默認(rèn)值: false
返回: Number 類型
從這個(gè) buffer 對(duì)象里,根據(jù)指定的偏移量,讀取一個(gè) signed 8 位整數(shù)。
若參數(shù) noAssert
為 true 將不會(huì)驗(yàn)證 offset
偏移量參數(shù)。 這意味著 offset 可能會(huì)超出 buffer 的末尾。默認(rèn)是 false
。
返回和 buffer.readUInt8
一樣,除非 buffer 中包含了有作為2 的補(bǔ)碼的有符號(hào)值。
offset
Number 類型
noAssert
Boolean, 可選參數(shù), 默認(rèn)值: false
返回: Number 類型
從這個(gè) buffer 對(duì)象里,根據(jù)指定的偏移量,使用特殊的 endian 格式讀取一個(gè) signed 16 位整數(shù)。
若參數(shù) noAssert
為 true 將不會(huì)驗(yàn)證 offset
偏移量參數(shù)。 這意味著 offset 可能會(huì)超出 buffer 的末尾。默認(rèn)是 false
。
返回和 buffer.readUInt16
一樣,除非 buffer 中包含了有作為 2 的補(bǔ)碼的有符號(hào)值。
offset
Number 類型
noAssert
Boolean, 可 位選參數(shù), 默認(rèn)值: false
返回: Number 類型
從這個(gè) buffer 對(duì)象里,根據(jù)指定的偏移量,使用指定的 endian 字節(jié)序格式讀取一個(gè) signed 32 位整數(shù)。
若參數(shù) noAssert
為 true 將不會(huì)驗(yàn)證 offset
偏移量參數(shù)。 這意味著 offset
可能會(huì)超出buffer 的末尾。默認(rèn)是 false
。
和 buffer.readUInt32
一樣返回,除非 buffer 中包含了有作為 2 的補(bǔ)碼的有符號(hào)值。
offset
Number 類型
noAssert
Boolean, 可選參數(shù), 默認(rèn)值: false
返回: Number 類型
從這個(gè) buffer 對(duì)象里,根據(jù)指定的偏移量,使用指定的 endian 字節(jié)序格式讀取一個(gè) 32 位浮點(diǎn)數(shù)。
若參數(shù) noAssert
為 true 將不會(huì)驗(yàn)證 offset
偏移量參數(shù)。 這意味著 offset
可能會(huì)超出buffer的末尾。默認(rèn)是 false
。
例如:
var buf = new Buffer(4); buf[0] = 0x00; buf[1] = 0x00; buf[2] = 0x80; buf[3] = 0x3f; console.log(buf.readFloatLE(0)); // 0x01
offset
Number 類型
noAssert
Boolean, 可選參數(shù), 默認(rèn)值: false
返回: Number 類型
從這個(gè) buffer 對(duì)象里,根據(jù)指定的偏移量,使用指定的 endian字節(jié)序格式讀取一個(gè) 64 位double。
若參數(shù) noAssert
為 true 將不會(huì)驗(yàn)證 offset
偏移量參數(shù)。 這意味著 offset
可能會(huì)超出buffer 的末尾。默認(rèn)是 false
。
例如:
var buf = new Buffer(8); buf[0] = 0x55; buf[1] = 0x55; buf[2] = 0x55; buf[3] = 0x55; buf[4] = 0x55; buf[5] = 0x55; buf[6] = 0xd5; buf[7] = 0x3f; console.log(buf.readDoubleLE(0)); // 0。3333333333333333
value
Number 類型
offset
Number 類型
noAssert
Boolean, 可選參數(shù), 默認(rèn)值: false
根據(jù)傳入的 offset
偏移量將 value
寫入 buffer。注意:value
必須是一個(gè)合法的有符號(hào) 8 位整數(shù)。
若參數(shù) noAssert
為 true 將不會(huì)驗(yàn)證 offset
偏移量參數(shù)。 這意味著 value
可能過(guò)大,或者 offset
可能會(huì)超出 buffer 的末尾從而造成 value 被丟棄。 除非你對(duì)這個(gè)參數(shù)非常有把握,否則不要使用。默認(rèn)是 false
。
例如:
var buf = new Buffer(4); buf.writeUInt8(0x3, 0); buf.writeUInt8(0x4, 1); buf.writeUInt8(0x23, 2); buf.writeUInt8(0x42, 3); console.log(buf); // <Buffer 03 04 23 42>
value
Number 類型
offset
Number 類型
noAssert
Boolean, 可選參數(shù), 默認(rèn)值: false
根據(jù)傳入的 offset
偏移量和指定的 endian 格式將 value
寫入 buffer。注意:value
必須是一個(gè)合法的有符號(hào) 16 位整數(shù)。
若參數(shù) noAssert
為 true 將不會(huì)驗(yàn)證 value
和 offset
偏移量參數(shù)。 這意味著 value
可能過(guò)大,或者 offset
可能會(huì)超出buffer的末尾從而造成 value 被丟棄。 除非你對(duì)這個(gè)參數(shù)非常有把握,否則盡量不要使用。默認(rèn)是 false
。
例如:
var buf = new Buffer(4); buf.writeUInt16BE(0xdead, 0); buf.writeUInt16BE(0xbeef, 2); console.log(buf); buf.writeUInt16LE(0xdead, 0); buf.writeUInt16LE(0xbeef, 2); console.log(buf); // <Buffer de ad be ef> // <Buffer ad de ef be>
value
Number 類型
offset
Number 類型
noAssert
Boolean, 可選參數(shù), 默認(rèn)值: false
根據(jù)傳入的 offset
偏移量和指定的 endian 格式將 value
寫入buffer。注意:value
必須是一個(gè)合法的有符號(hào) 32 位整數(shù)。
若參數(shù) noAssert
為 true 將不會(huì)驗(yàn)證 value
和 offset
偏移量參數(shù)。 這意味著value
可能過(guò)大,或者offset可能會(huì)超出buffer的末尾從而造成 value
被丟棄。 除非你對(duì)這個(gè)參數(shù)非常有把握,否則盡量不要使用。默認(rèn)是 false
。
例如:
var buf = new Buffer(4); buf.writeUInt32BE(0xfeedface, 0); console.log(buf); buf.writeUInt32LE(0xfeedface, 0); console.log(buf); // <Buffer fe ed fa ce> // <Buffer ce fa ed fe>
value
Number 類型
offset
Number 類型
noAssert
Boolean, 可選參數(shù), 默認(rèn)值: false
根據(jù)傳入的 offset
偏移量將 value
寫入 buffer 。注意:value
必須是一個(gè)合法的 signed 8 位整數(shù)。
若參數(shù) noAssert
為 true 將不會(huì)驗(yàn)證 value
和 offset
偏移量參數(shù)。 這意味著 value
可能過(guò)大,或者 offset 可能會(huì)超出 buffer 的末尾從而造成 value
被丟棄。 除非你對(duì)這個(gè)參數(shù)非常有把握,否則盡量不要使用。默認(rèn)是 false
。
和 buffer.writeUInt8
一樣工作,除非是把有2的補(bǔ)碼的 有符號(hào)整數(shù)
有符號(hào)整形寫入buffer。
value
Number 類型
offset
Number 類型
noAssert
Boolean, 可選參數(shù), 默認(rèn)值: false
根據(jù)傳入的 offset
偏移量和指定的 endian 格式將 value
寫入 buffer。注意:value
必須是一個(gè)合法的 signed 16 位整數(shù)。
若參數(shù) noAssert
為 true 將不會(huì)驗(yàn)證 value
和 offset
偏移量參數(shù)。 這意味著 value
可能過(guò)大,或者 offset 可能會(huì)超出 buffer 的末尾從而造成 value
被丟棄。 除非你對(duì)這個(gè)參數(shù)非常有把握,否則盡量不要使用。默認(rèn)是 false
。
和 buffer.writeUInt16*
一樣工作,除非是把有2的補(bǔ)碼的有符號(hào)整數(shù) 有符號(hào)整形寫入buffer
。
value
Number 類型
offset
Number 類型
noAssert
Boolean, 可選參數(shù), 默認(rèn)值: false
根據(jù)傳入的 offset
偏移量和指定的 endian 格式將 value
寫入 buffer。注意:value
必須是一個(gè)合法的 signed 32 位整數(shù)。
若參數(shù) noAssert
為 true 將不會(huì)驗(yàn)證 value
和 offset
偏移量參數(shù)。 這意味著 value
可能過(guò)大,或者 offset
可能會(huì)超出 buffer 的末尾從而造成 value
被丟棄。 除非你對(duì)這個(gè)參數(shù)非常有把握,否則盡量不要使用。默認(rèn)是 false
。
和 buffer.writeUInt32*
一樣工作,除非是把有2的補(bǔ)碼的有符號(hào)整數(shù) 有符號(hào)整形寫入buffer。
value
Number 類型
offset
Number 類型
noAssert
Boolean, 可選參數(shù), 默認(rèn)值: false
根據(jù)傳入的 offset
偏移量和指定的 endian 格式將 value
寫入 buffer 。注意:當(dāng) value
不是一個(gè) 32 位浮點(diǎn)數(shù)類型的值時(shí),結(jié)果將是不確定的。
若參數(shù) noAssert
為 true 將不會(huì)驗(yàn)證 value
和 offset
偏移量參數(shù)。 這意味著 value可能過(guò)大,或者 offset 可能會(huì)超出 buffer 的末尾從而造成 value
被丟棄。 除非你對(duì)這個(gè)參數(shù)非常有把握,否則盡量不要使用。默認(rèn)是 false
。
例如:
var buf = new Buffer(4); buf.writeFloatBE(0xcafebabe, 0); console.log(buf); buf.writeFloatLE(0xcafebabe, 0); console.log(buf); // <Buffer 4f 4a fe bb> // <Buffer bb fe 4a 4f>
value
Number 類型
offset
Number 類型
noAssert
Boolean, 可選參數(shù), 默認(rèn)值: false
根據(jù)傳入的 offset
偏移量和指定的 endian 格式將 value
寫入 buffer。注意:value
必須是一個(gè)有效的 64 位double 類型的值。
若參數(shù) noAssert
為 true 將不會(huì)驗(yàn)證 value
和 offset
偏移量參數(shù)。 這意味著 value
可能過(guò)大,或者 offset 可能會(huì)超出 buffer 的末尾從而造成value
被丟棄。 除非你對(duì)這個(gè)參數(shù)非常有把握,否則盡量不要使用。默認(rèn)是 false
。
例如:
var buf = new Buffer(8); buf.writeDoubleBE(0xdeadbeefcafebabe, 0); console.log(buf); buf.writeDoubleLE(0xdeadbeefcafebabe, 0); console.log(buf); // <Buffer 43 eb d5 b7 dd f9 5f d7> // <Buffer d7 5f f9 dd b7 d5 eb 43>
value
offset
Number 類型, Optional
end
Number 類型, Optional
使用指定的 value
來(lái)填充這個(gè) buffer。如果沒(méi)有指定 offset
(默認(rèn)是 0) 并且 end
(默認(rèn)是 buffer.length
) ,將會(huì)填充整個(gè)buffer。
var b = new Buffer(50); b.fill("h");
Number 類型, 默認(rèn)值: 50
設(shè)置當(dāng)調(diào)用 buffer.inspect()
方法后,將會(huì)返回多少 bytes 。用戶模塊重寫這個(gè)值可以。
注意這個(gè)屬性是 require('buffer')
模塊返回的。這個(gè)屬性不是在全局變量 Buffer 中,也不在 buffer 的實(shí)例里。
返回一個(gè)不被池管理的 Buffer
。
大量獨(dú)立分配的 Buffer 容易帶來(lái)垃圾,為了避免這個(gè)情況,小于 4KB 的空間都是切割自一個(gè)較大的獨(dú)立對(duì)象。這種策略既提高了性能也改善了內(nèi)存使用率。V8 不需要跟蹤和清理過(guò)多的 Persistent
對(duì)象。
當(dāng)開發(fā)者需要將池中一小塊數(shù)據(jù)保留一段時(shí)間,比較好的辦法是用 SlowBuffer 創(chuàng)建一個(gè)不被池管理的 Buffer 實(shí)例,并將相應(yīng)數(shù)據(jù)拷貝出來(lái)。
// need to keep around a few small chunks of memory var store = []; socket。on('readable', function() { 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); });
請(qǐng)謹(jǐn)慎使用,僅作為經(jīng)常發(fā)現(xiàn)他們的應(yīng)用中過(guò)度的內(nèi)存保留時(shí)的最后手段。