Node.js緩衝器


純JavaScript是Unicode友好的,但對二進位制資料不是很好。當與TCP流或檔案系統打交道時,有必要處理位元組流。 Node提供緩衝器類,它提供範例來儲存原始資料相似的一個整數陣列,但對應於在V8堆外的原始儲存器的分配。

Buffer類是一個全域性類,可以在應用程式,匯入緩衝模組進行存取。

建立緩衝區

Node緩衝器可以以各種方式來構造。

方法 1

以下是建立10個位元組的漢緩衝的語法:

var buf = new Buffer(10);

方法 2

下面是用來從給定陣列建立一個緩衝區的語法:

var buf = new Buffer([10, 20, 30, 40, 50]);

方法 3

下面是用來從給定的字串和可選的編碼型別建立緩衝區的語法:

var buf = new Buffer("Simply Easy Learning", "utf-8");

雖然“UTF8”是預設的編碼,但你可以使用其它的編碼: "ascii", "utf8", "utf16le", "ucs2", "base64" 或 "hex".

寫到緩衝器

語法

以下被寫入到一個節點緩衝器的方法的語法:

buf.write(string[, offset][, length][, encoding])

引數

下面是使用的引數的說明:

  • string - 這是要被寫入的資料串緩衝區。

  • offset - 這是緩衝區開始的索引。預設值為0。

  • length - 這是要寫入的位元組的數目。預設是 buffer.length

  • encoding - 編碼使用。 “UTF8”是預設的編碼

返回值

這個方法返回寫入的位元組數。如果沒有足夠的空間在緩衝,以適應整個字串,它將寫該字串的一部分。

範例

buf = new Buffer(256);
len = buf.write("Simply Easy Learning");

console.log("Octets written : "+  len);

當上述程式被執行時,它會產生以下結果:

Octets written : 20

從緩衝器讀取

語法

下面是從節點緩衝器的資料的方法讀取的語法:

buf.toString([encoding][, start][, end])

引數

下面是使用的引數的說明:

  • encoding - 編碼使用。 “UTF8”是預設的編碼

  • start - 開始讀取的索引,預設為0。

  • end - 最終讀數結束的索引,預設值是整個緩衝區。

返回值

此方法解碼並返回來自使用指定的字元集編碼的編碼緩衝器的資料的字串。

範例

buf = new Buffer(26);
for (var i = 0 ; i < 26 ; i++) {
  buf[i] = i + 97;
}

console.log( buf.toString('ascii'));       // outputs: abcdefghijklmnopqrstuvwxyz
console.log( buf.toString('ascii',0,5));   // outputs: abcde
console.log( buf.toString('utf8',0,5));    // outputs: abcde
console.log( buf.toString(undefined,0,5)); // encoding defaults to 'utf8', outputs abcde

當上述程式被執行時,它會產生以下結果:

abcdefghijklmnopqrstuvwxyz
abcde
abcde
abcde

轉換緩衝到JSON

語法

以下是轉換節點快取到JSON物件方法的語法:

buf.toJSON()

返回值

此方法返回緩衝區JSON-表示。

範例

var buf = new Buffer('Simply Easy Learning');
var json = buf.toJSON(buf);

console.log(json);

當上述程式被執行時,它會產生以下結果:

[ 83, 105, 109, 112, 108, 121, 32, 69, 97, 115, 121, 32, 76, 101, 97, 114, 110, 105, 110, 103 ]

接續緩衝器

語法

以下是連線Node快取到單個節點快取方法的語法:

Buffer.concat(list[, totalLength])

引數

下面是使用的引數的說明:

  • list -要連線緩衝區的陣列物件列表

  • totalLength - 這是緩衝器連線在一起時的總長度

返回值

該方法返回一個緩衝區範例。

範例

var buffer1 = new Buffer('YiiBai ');
var buffer2 = new Buffer('Simply Easy Learning');
var buffer3 = Buffer.concat([buffer1,buffer2]);
console.log("buffer3 content: " + buffer3.toString());

當上述程式被執行時,它會產生以下結果:

buffer3 content: YiiBai Simply Easy Learning

比較緩衝器

語法

下面是比較兩個Node緩衝器的方法的語法:

buf.compare(otherBuffer);

引數

下面是使用引數的說明:

  • otherBuffer - 這是將與被比較的其它緩衝 buf

返回值

返回一個數位,表示否到來之前或之後或和otherBuffer排序順序一樣。

範例

var buffer1 = new Buffer('ABC');
var buffer2 = new Buffer('ABCD');
var result = buffer1.compare(buffer2);

if(result < 0) {
   console.log(buffer1 +" comes before " + buffer2);
}else if(result == 0){
   console.log(buffer1 +" is same as " + buffer2);
}else {
   console.log(buffer1 +" comes after " + buffer2);
}

當上述程式被執行時,它會產生以下結果:

ABC comes before ABCD

複製緩衝區

語法

以下是複製節點緩衝器的方法的語法:

buf.copy(targetBuffer[, targetStart][, sourceStart][, sourceEnd])

引數

下面是使用的引數的說明:

  • targetBuffer - 緩衝區物件的緩衝區將被複製。

  • targetStart - 數量,可選,預設:0

  • sourceStart - 數量,可選,預設:0

  • sourceEnd - 數量,可選,預設:buffer.length

返回值

沒有返回值。拷貝資料從該緩衝器的一區域中,即使在目標記憶體區域與源重疊的目標緩衝器的區域。如果不確定targetStart,那麼sourceStart引數預設為0,sourceEnd預設為buffer.length。

範例

var buffer1 = new Buffer('ABC');
//copy a buffer
var buffer2 = new Buffer(3);
buffer1.copy(buffer2);
console.log("buffer2 content: " + buffer2.toString());

當上述程式被執行時,它會產生以下結果:

buffer2 content: ABC

切片式緩衝器

語法

以下是獲得一個節點緩衝器的子緩衝器的方法的語法:

buf.slice([start][, end])

引數

下面是使用的引數的說明:

  • start - 數量,可選,預設:0

  • end - 數量可選,預設:buffer.length

返回值

返回一個新的緩衝區,它參照相同的記憶體如old,並 start 切片(預設為0)和 end(預設為buffer.length)索引。負索引則從緩衝區末尾開始。

範例

var buffer1 = new Buffer('YiiBai');
//slicing a buffer
var buffer2 = buffer1.slice(0,9);
console.log("buffer2 content: " + buffer2.toString());

當上述程式被執行時,它會產生以下結果:

buffer2 content: Yiibai

緩衝區長度

語法

以下是得到以位元組為單位的節點緩衝器的大小的方法的語法:

buf.length;

返回值

返回緩衝器的位元組的大小。

範例

var buffer = new Buffer('YiiBai');
//length of the buffer
console.log("buffer length: " + buffer.length);

當上述程式被執行時,它會產生以下結果:

buffer length: 14

方法參考

以下是緩衝模組提供node.js參考,進一步的細節,可以參考官方文件。

SN 方法 & 描述
1 new Buffer(size) 
分配的大小為八位的一個新緩衝區。請注意,size不得超過kMaxLength。否則,引發RangeError將在這裡丟擲。
2 new Buffer(buffer) 
複製傳遞的緩衝區的資料到一個新的緩衝範例。
3 new Buffer(str[, encoding])
分配包含給定str是一個新的緩衝區。編碼預設為 'utf8'.
4 buf.length
返回位元組緩衝區的大小。注意,這並不一定是contents. length長度大小。儲存器分配給緩衝物件的量。當緩衝器的內容被改變它不會改變。
5 buf.write(string[, offset][, length][, encoding])
寫入字串的使用給定的編碼偏移緩衝區。 offset 預設是 0, 編碼預設是 'utf8'. length 要寫入的位元組數。返回寫入的位元組數。
6 buf.writeUIntLE(value, offset, byteLength[, noAssert])
寫入值到緩衝區指定的偏移量和byteLength。支援高達48位元的精度。設定noAssert為true,以要跳過的值和偏移驗證。預設為false。
7 buf.writeUIntBE(value, offset, byteLength[, noAssert])
寫入值到緩衝區指定偏移量和byteLength。支援高達48位元的精度。設定noAssert真要跳過的值和偏移驗證。預設為false。
8 buf.writeIntLE(value, offset, byteLength[, noAssert])
寫值到緩衝在指定偏移和byteLength. 支援高達48位元的精度。設定noAssert真要跳過的值和偏移驗證。預設為false。
9 buf.writeIntBE(value, offset, byteLength[, noAssert])
寫入值到緩衝區指定的偏移量和byteLength。支援高達48位元的精度。設定noAssert真要跳過的值和偏移驗證。預設為false。
10 buf.readUIntLE(offset, byteLength[, noAssert])
廣義版本是所有數值讀取方法。支援高達48位元的精度。設定noAssert為true時為跳過偏移驗證。 這意味著,偏移可以是超出緩衝區的末尾。預設為false。
11 buf.readUIntBE(offset, byteLength[, noAssert])
廣義版本是所有數值讀取方法。支援高達48位元的精度。設定noAssert為true時為跳過偏移驗證。這意味著,偏移可以是超出緩衝區的末尾。預設為false。
12 buf.readIntLE(offset, byteLength[, noAssert])
廣義版本是所有數值讀取方法。支援高達48位元的精度。設定noAssert為true時為跳過偏移驗證。這意味著,偏移可以是超出緩衝區的末尾。預設為false。
13 buf.readIntBE(offset, byteLength[, noAssert])
廣義版本是所有數值讀取方法。支援高達48位元的精度。設定noAssert為true時為跳過偏移驗證。這意味著,偏移可以是超出緩衝區的末尾。預設為false。
14 buf.toString([encoding][, start][, end])
解碼並返回使用指定的字元集編碼編碼緩衝資料的字串。
15 buf.toJSON()
返回緩衝區範例的JSON-表示。JSON.stringify字串化一個緩衝區範例時,隱式呼叫這個函式。
16 buf[index]
獲取和設定位元組索引。該值是指單個位元組,所以合法範圍為0x00和0xFF的十六進位制或0和255之間。
17 buf.equals(otherBuffer)
返回otherBuffer是否有相同的位元組的布林值。
18 buf.compare(otherBuffer)
返回一個數位,表示是否到來之前或之後或在排序順序和otherBuffer一樣。
19 buf.copy(targetBuffer[, targetStart][, sourceStart][, sourceEnd])
從該緩衝器拷貝資料到一區域中,即使在目標記憶體區域與源重疊的目標緩衝器的區域。如果不確定targetStart和sourceStart引數預設為0,sourceEnd預設為buffer.length。
20 buf.slice([start][, end])
返回一個新的緩衝區,它參照相同的記憶體如old,但補償並開始裁剪(預設為0)和結束(預設為buffer.length)索引。負索引從緩衝區末尾開始。
21 buf.readUInt8(offset[, noAssert])
從緩衝區讀取一個無符號的8位元整數指定的偏移量。設定noAssert為true時為跳過偏移驗證。這意味著,偏移可以是超出緩衝區的末尾。預設為false。
22 buf.readUInt16LE(offset[, noAssert])
從緩衝區讀取指定的偏移量與指定的endian格式的16位元無符號整數。設定noAssert為true時為跳過偏移驗證。這意味著,偏移可以是超出緩衝區的末尾。預設為false。
23 buf.readUInt16BE(offset[, noAssert])
從緩衝區讀取指定偏移量與指定endian格式的16位元無符號整數。設定noAssert為true時為跳過偏移驗證。這意味著,偏移可以是超出緩衝區的末尾。預設為false。
24 buf.readUInt32LE(offset[, noAssert])
從緩衝區讀取指定的偏移量與指定的endian格式的32位元無符號整數。設定noAssert為true時為跳過偏移驗證。這意味著,偏移可以是超出緩衝區的末尾。預設為false。
25 buf.readUInt32BE(offset[, noAssert])
從緩衝區讀取指定偏移量使用指定的endian格式的32位元無符號整數。設定noAssert為true時為跳過偏移驗證。 這意味著,偏移可以是超出緩衝區的末尾。預設為false。
26 buf.readInt8(offset[, noAssert])
讀取指定的偏移量從緩衝區中的有符號的8位元整數。設定noAssert為true時為跳過偏移驗證。這意味著,偏移可以是超出緩衝區的末尾。預設為false。
27 buf.readInt16LE(offset[, noAssert])
從緩衝區讀取指定的偏移量使用指定endian格式有符號的16位元整數。設定noAssert為true時為跳過偏移驗證。這意味著,偏移可以是超出緩衝區的末尾。預設為false。
28 buf.readInt16BE(offset[, noAssert])
從緩衝區讀取指定的偏移量使用指定endian格式有符號的16位元整數。設定noAssert為true時為跳過偏移驗證。 這意味著,偏移可以是超出緩衝區的末尾。預設為false。
29 buf.readInt32LE(offset[, noAssert])
從緩衝區讀取指定的偏移量使用指定endian格式32位元有符號整數。設定noAssert為true跳過偏移驗證。這意味著,偏移可以是超出緩衝區的末尾。預設為false。
30 buf.readInt32BE(offset[, noAssert])
從緩衝區讀取指定的偏移量使用指定endian格式32位元有符號整數。設定noAssert為true時為跳過偏移驗證。這意味著,偏移可以是超出緩衝區的末尾。預設為false。
31 buf.readFloatLE(offset[, noAssert])
從緩衝區讀取指定的偏移量使用指定尾數格式的32位元浮點。設定noAssert為true時為跳過偏移驗證。這意味著,偏移可以是超出緩衝區的末尾。預設為false。
32 buf.readFloatBE(offset[, noAssert])
從緩衝區讀取指定的偏移量使用指定尾數格式的32位元浮點。設定noAssert為true時為跳過偏移驗證。這意味著,偏移可以是超出緩衝區的末尾。預設為false。
33 buf.readDoubleLE(offset[, noAssert])
從緩衝區指定的偏移量讀取一個64位元的double,使用指定的endian格式。設定noAssert為true時為跳過偏移驗證。這意味著,偏移可以是超出緩衝區的末尾。預設為false。
34 buf.readDoubleBE(offset[, noAssert])
讀取一個64位元的double從緩衝區指定的偏移量使用指定的endian格式。設定noAssert為true跳過偏移驗證。這意味著,偏移可以是超出緩衝區的末尾。預設為false。
35 buf.writeUInt8(value, offset[, noAssert])
寫入值到緩衝區指定的偏移量。注意,值必須是一個有效的無符號8位元整數。設定noAssert為true時為跳過的值和偏移驗證。這意味著值可能具體函式和偏移可能超出導致被丟棄的值長於緩衝區的末尾。這不應該被使用,除非是一定正確。預設為false。
36 buf.writeUInt16LE(value, offset[, noAssert])
寫入值到緩衝區指定的偏移量使用指定endian格式。注意,值必須是一個有效的無符號的16位元整數。設定noAssert為true時為要跳過的值和偏移驗證。這意味著值可能具體函式和偏移可能超出導致被丟棄的值長於緩衝區的末尾。這不應該被使用,除非一定正確。預設為false。
37 buf.writeUInt16BE(value, offset[, noAssert])
寫入值到緩衝區指定的偏移量使用指定endian格式。注意,值必須是一個有效的無符號的16位元整數。設定noAssert為true時為要跳過的值和偏移驗證。這意味著值可能具體函式和偏移可能超出導致被丟棄的值長於緩衝區的末尾。這不應該被使用,除非一定正確。預設為false。
38 buf.writeUInt32LE(value, offset[, noAssert])
寫入值到緩衝區指定的偏移量使用指定endian格式。注意,值必須是一個有效的無符號的32位元整數。設定noAssert為true時為要跳過的值和偏移驗證。這意味著值可能太大的具體函式和偏移可能超出導致被丟棄的值長於緩衝區的末尾。這不應該被使用,除非一定正確。預設為false。
39 buf.writeUInt32BE(value, offset[, noAssert])
寫入值到緩衝區指定的偏移量使用指定endian格式。注意,值必須是一個有效的無符號的32位元整數。設定noAssert為true時為要跳過的值和偏移驗證。這意味著值可能太大的具體函式和偏移可能超出導致被丟棄的值長於緩衝區的末尾。這不應該被使用,除非一定正確。預設為false。
40 buf.writeInt8(value, offset[, noAssert])
寫入值到緩衝區指定的偏移量使用指定endian格式。注意,值必須是一個有效符號的8位元整數。設定noAssert為true時為要跳過的值和偏移驗證。這意味著值可能具體函式和偏移可能超出導致被丟棄的值的緩衝區的末尾。這不應該被使用,除非一定正確。預設為false。
41 buf.writeInt16LE(value, offset[, noAssert])
寫入值到緩衝區指定的偏移量使用指定endian格式。注意,值必須是一個有效符號的16位元整數。設定noAssert為true時為要跳過的值和偏移驗證。這意味著值可能具體函式和偏移可能超出導致被丟棄的值長於緩衝區的末尾。這不應該被使用,除非一定正確。預設為false。
42 buf.writeInt16BE(value, offset[, noAssert])
寫入值到緩衝區指定的偏移量使用指定endian格式。注意,值必須是一個有效符號的16位元整數。設定noAssert為true時為要跳過的值和偏移驗證。這意味著值可能具體函式和偏移可能超出導致被丟棄的值長於緩衝區的末尾。這不應該被使用,除非一定正確。預設為false。
43 buf.writeInt32LE(value, offset[, noAssert])
寫入值到緩衝區指定的偏移量使用指定endian格式。注意,值必須是一個有效符號的32位元整數。設定noAssert為true時為要跳過的值和偏移驗證。這意味著值可能具體函式和偏移可能超出導致被丟棄的值長於緩衝區的末尾。這不應該被使用,除非你是一定的正確性。預設為false。
44 buf.writeInt32BE(value, offset[, noAssert])
寫入值到緩衝區指定的偏移量使用指定endian格式。注意,值必須是一個有效符號的32位元整數。設定noAssert為true時為要跳過的值和偏移驗證。這意味著值可能具體函式和偏移可能超出導致被丟棄的值長於緩衝區的末尾。這不應該被使用,除非一定正確。預設為false。
45 buf.writeFloatLE(value, offset[, noAssert])
寫入值到緩衝區指定的偏移量使用指定endian格式。注意,值必須是有效的32位元浮點值。設定noAssert為true時為要跳過的值和偏移驗證。這意味著值可能具體函式和偏移可能超出導致被丟棄的值長於緩衝區的末尾。這不應該被使用,除非一定正確。預設為false。
46 buf.writeFloatBE(value, offset[, noAssert])
寫入值到緩衝區指定的偏移量使用指定endian格式。注意,值必須是有效的32位元浮點。設定noAssert為true時為要跳過的值和偏移驗證。這意味著值可能具體函式和偏移可能超出導致被丟棄的值長過了緩衝區的末尾。 這不應該被使用,除非是正確的。預設為false。
47 buf.writeDoubleLE(value, offset[, noAssert])
寫入值到緩衝區指定偏移量使用指定的endian格式. 注意,值必須是有效的64位元double。設定noAssert為true為要跳過的值和偏移驗證。這意味著值可能太大的具體函式和偏移可能超出導致被丟棄的緩衝區末尾的值。這不應該被使用,除非是正確的。預設為false。
48 buf.writeDoubleBE(value, offset[, noAssert])
寫入值到緩衝區指定的偏移量使用指定endian格式。注意,值必須是有效的64位元double。設定noAssert為true為要跳過的值和偏移驗證。這意味著值可能太大的具體函式和偏移可能超出導致被默默地丟棄的值的緩衝區的末尾。這不應該被使用,除非是一定正確。預設為false。
49 buf.fill(value[, offset][, end])
填充指定值的緩衝區。如果偏移量(預設為0)和結束(預設為buffer.length)不給它填滿整個緩衝區。

類方法

SN 方法 & 描述
1 Buffer.isEncoding(encoding)
返回true如果編碼為有效編碼引數,否則返回false
2 Buffer.isBuffer(obj)
測試如果obj是一個緩衝
3 Buffer.byteLength(string[, encoding])
給出了一個字串的實際位元組長度。編碼預設為'utf8'。 ''. 這是不一樣的字串,prototype.length返回字串中的字元的數目
4 Buffer.concat(list[, totalLength])
返回一個緩衝器是連線所有的緩衝器列表中的共同的結果
5 Buffer.compare(buf1, buf2)
同buf1.compare(buf2)。有用於排序緩衝器陣列