位置:首頁 > 其他技術 > Node.js教學 > Node.js緩衝器

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)。有用於排序緩衝器數組