Buffers 緩存對象

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

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

Buffer 對象是全局對象。

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

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

new Buffer(size)

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

new Buffer(array)

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

new Buffer(str, encoding='utf8')

新建一個保存指定字符串的buffer 對象。

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

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

示例:將一個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ù)并使用指定的編碼返回字符串,轉換從start 參數(shù)指定的位置開始,到end 結束。 參看上面buffer.write()的例子。

buffer[index]

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

例如:將一個ASCII 字符串復制進buffer,每次一個字節(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')

返回字符串的實際字節(jié)數(shù)。這個函數(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é)為單位)。請注意,這個不是存放內(nèi)容的大小,而是分配給buffer 對象的內(nèi)存大小。這個 大小不隨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)

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

例如:新建兩個buffer 對象,然后將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 對象,但是開始和結束的位置由start 和end 參數(shù)指定。 修改新的buffer 對象將會改動原來的buffer。

例如:使用字母表建立一個buffer 對象,并剪切出一個新的buffer,然后修改原始buffer 的一個字節(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)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號