Buffers 緩存對(duì)象

2018-07-11 09:33 更新
純粹的Javascript 對(duì)Unicode 很友好,但是操作二進(jìn)制數(shù)據(jù)就不怎么在行了。處理TCP 數(shù)據(jù)流或者文件時(shí),必 須要操作二進(jìn)制數(shù)據(jù)流。node 提供了一些方法來創(chuàng)建、操作和接收二進(jìn)制數(shù)據(jù)流。

原始的數(shù)據(jù)保存在Buffer 類的實(shí)例中。Buffer 類似于一個(gè)整數(shù)數(shù)組,不同之處在于它和在V8內(nèi)存堆之外分配的 一段內(nèi)存數(shù)據(jù)相對(duì)應(yīng)。Buffer 對(duì)象的大小不能調(diào)整。你可以通過"require('buffer').Buffer"來使用這個(gè)類。

Buffer 對(duì)象是全局對(duì)象。

Buffer 和Javascirpt 中string 對(duì)象之間的轉(zhuǎn)換需要指定編碼方式。如下是node 支持的各種編碼方式:

'ascii' - 應(yīng)用于7位的ASCII 數(shù)據(jù)。這種編碼方式速度很快,它會(huì)刪除字節(jié)的高位。
'utf8' - Unicode 字符。許多網(wǎng)頁和其他文檔使用UTF-8。
'binary' - 一種只使用每個(gè)字符前8個(gè)字節(jié)將原始的二進(jìn)制數(shù)據(jù)編碼進(jìn)字符串的方式。
這個(gè)方式已經(jīng)廢棄,應(yīng)當(dāng)盡量使用buffer 對(duì)象。這個(gè)編碼將會(huì)在未來的node 中刪除。

new Buffer(size)

創(chuàng)建指定大小的buffer 對(duì)象。

new Buffer(array)

從數(shù)組新建buffer 對(duì)象。

new Buffer(str, encoding='utf8')

新建一個(gè)保存指定字符串的buffer 對(duì)象。

buffer.write(string, offset=0, encoding='utf8')

使用指定的編碼方式將字符串從指定偏移開始寫入buffer,然后返回實(shí)際寫入的大小。如果buffer 空間不足, 則只會(huì)寫入部分字符串。在本例中使用'utf8'編碼,這種方式不會(huì)寫入半個(gè)字符。

示例:將一個(gè)utf8字符串寫入buffer,然后打印出來

buf = new Buffer(256);
len = buf.write('\u00bd + \u00bc = \u00be', 0);
console.log(len + " bytes: " + buf.toString('utf8', 0, len));
// 12 bytes: ? + ? = ?

buffer.toString(encoding, start=0, end=buffer.length)

解碼buffer 數(shù)據(jù)并使用指定的編碼返回字符串,轉(zhuǎn)換從start 參數(shù)指定的位置開始,到end 結(jié)束。 參看上面buffer.write()的例子。

buffer[index]

獲取或設(shè)置指定的字節(jié)。返回值代表一個(gè)字節(jié),所以返回值的合法范圍是十六進(jìn)制0x00到0xFF 或者十進(jìn)制0至 255。

例如:將一個(gè)ASCII 字符串復(fù)制進(jìn)buffer,每次一個(gè)字節(jié):

str = "node.js",
buf = new Buffer(str.length),
i;
for (var i = 0; i < str.length ; i += 1) {
buf[i] = str.charCodeAt(i);
}
console.log(buf);
// node.js

Buffer.byteLength(string, encoding='utf8')

返回字符串的實(shí)際字節(jié)數(shù)。這個(gè)函數(shù)和String.prototype.length 不同,后者返回字符串的字符數(shù)。

str = '\u00bd + \u00bc = \u00be';
console.log(str + ": " + str.length + " characters, " +
Buffer.byteLength(str, 'utf8') + " bytes");
// ? + ? = ?: 9 characters, 12 bytes

buffer.length

buffer 的大?。ㄒ宰止?jié)為單位)。請(qǐng)注意,這個(gè)不是存放內(nèi)容的大小,而是分配給buffer 對(duì)象的內(nèi)存大小。這個(gè) 大小不隨buffer 中存放內(nèi)容的多少而改變。

buf = new Buffer(1234);
console.log(buf.length);
buf.write("some string", "ascii", 0);
console.log(buf.length);
// 1234
// 1234

buffer.copy(targetBuffer, targetStart, sourceStart, sourceEnd=buffer.length)

在兩個(gè)buffer 之間執(zhí)行內(nèi)存拷貝。

例如:新建兩個(gè)buffer 對(duì)象,然后將buf1中16至19字節(jié)拷貝到buf2中第八字節(jié)開始的空間中。

buf1 = new Buffer(26),
buf2 = new Buffer(26),
i;
for (var i = 0 ; i < 26 ; i += 1) {
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));

buffer.slice(start, end)

返回和老的buffer 引用同一段內(nèi)存的新buffer 對(duì)象,但是開始和結(jié)束的位置由start 和end 參數(shù)指定。 修改新的buffer 對(duì)象將會(huì)改動(dòng)原來的buffer。

例如:使用字母表建立一個(gè)buffer 對(duì)象,并剪切出一個(gè)新的buffer,然后修改原始buffer 的一個(gè)字節(jié)。

buf1 = new Buffer(26), buf2,
i;
for (var i = 0 ; i < 26 ; i += 1) {
buf1[i] = i + 97; // 97 is ASCII a
}
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


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)