客戶端JavaScript中沒有對二進制數據提供很好的支持。可是在處理TCP流或文件流時,必需要處理二進制數據。Node.js定義了一個Buffer類,用來建立一個專門存放二進制數據的緩存區。
Buffer中存的數據默認爲16進制。
一、建立Buffer對象
在Node.js中,Buffer類是一個能夠在任何模塊中不使用的全局類,不要單獨加載。可使用New關鍵字來建立該類的實例對象。
Buffer類有三種形式的構造函數:
第一種:將緩存區大小(以字節爲單位)做爲構造函數的參數
var size = 128; //緩存區大小單位字節
var buf = new Buffer(size);
此時被建立的Buffer對象有一個length屬性,屬性值爲緩存區大小。
console.log(size); //128
可使用Buffer對象的fill()函數來初始化緩存區中的全部內容:
buf.fill(value,[offset],[end]);
ps:
value 必須參數,參數值是須要被寫入的數值。
[offset] 可選參數,默認爲0,用於指定從第幾個字節處開始寫入被指定的數值
[end] 可選參數,用於指定數值一直寫入到第幾個字節處,默認值爲Buffer對象的最大值
例子:
一、聲明緩存區實例,並在第10個字節的位置輸入1,直到末尾。
二、在第20~30字節之間,寫入2
buf = new Buffer(128);
buf.fill(1,10);
buff.fill(2,20,30);
第二種:直接使用一個數組來初始化緩存區。
var buf = new Buffer(Array);
這種形式的構造函數中,使用了一個存放須要被指定數值的數組來做爲構造函數的參數。
var arr = [1,2,3];
var buf = new Buffer(arr);
console.log(buf); //
第三種:直接使用一個字符串來初始化緩存區。
var str = "你好";
var buf = new Buffer(str,[encoding]);
ps:
str:必須參數,參數值用於初始化緩存區,
[encoding]:可選參數,用於指定字符串文字編碼格式,默認爲"utf8"
Node.js中可使用的編碼:
ascii : ASCII字符串
utf8 : UTF-8字符串
utf16le : UTF-16LE字符串
usc2 : USC2字符串
base64 : 通過BASE64編碼後的字符串
binary : 二進制數據(不推薦使用)
hex : 使用十六進制數值表示的字符串
二、字符串的長度與緩存區的長度
Node.js中,一個字符串長度與根據該字符串建立的緩存區的長度並不相同。計算字符串長度時,以文字做爲單位;計算緩存區長度時,以字節做爲單位。
Buffer對象用slice()函數取出指定位置處的數據,該方法的使用與string對象的slice方法相同。slice()函數並非複製緩存區的數據而是共享數據,所以,一旦修改了slice()函數取出的數據,則緩存區中保存的數據也將被修改。
三、Buffer對象與字符串對象之間的相互轉換
Buffer 對象的toString方法能夠將Buffer對象中保存的數據轉換爲字符串:
var str = "我喜好編程";
var buf = new Buffer(str);
buf.toString([encoding],[start],[end]);
[encoding]:指定Buffer對象中保存的文字編碼格式,默認值爲utf8;
[start]:指定被轉換數據的起始位置,以字節爲單位
[end]:指定被轉換數據的終止位置,以字節爲單位
實例:
var str = "我喜好編程";
var buf = new Buffer(str);
buf.toString("utf8",9,12); //編
buf.toString("utf8",12,buf.length); //程
Buffer對象的write方法,用於向已經建立的Buffer對象中寫入字符串。
var str = "我喜好編程";
var buf = new Buffer(str);
buf.write(string,[offset],[length],[encoding]);
string:必須參數,用於指定須要寫入的字符串
[offset]:指定字符串轉換位字節數據後的寫入位置
[length]:指定字符串轉換位字節數據後的寫入位置
[encoding]:指定寫入字符串時使用的編碼格式,默認爲utf8;
字節數據的書寫位置從第1+offset個字節開始,到offset+length爲止。
var str = "我喜好編程";
var buf = new Buffer(str);
buf.write("熱",3,3); //3
buf.toString(); //我熱愛編程
StringDecoder對象,能夠將Buffer對象中的數據轉換爲字符串,該對象的做用與Buffer對象的toString()函數的做用相同,可是對於utf8編碼格式的字符串提供更好的支持。在使用StringDecoder對象時,首先須要加載Node.js中的string_decoder模塊。
加載模塊
var
stringDecoder=require("string_decoder").StringDecoder;
實例化對象
var decoder = new StringDecoder([encoding]);
使用該對象的write()函數能夠將Buffer對象中的數據轉換位字符串
decoder.write(buffer);
四、Buffer對象與JSON對象之間的相互轉換
Node.js中,可使用JSON.stringify()方法將Buffer對象中保存的數據轉換爲一個字符串,也可使用JSON.parse()方法將一個通過轉換後的字符串還原爲一個數組。
var str = "我喜好編程";
var buf = new Buffer(str);
var json = JSON.stringify(buf);
var parseArr = JSON.parse(json);
var copy = new Buffer(parseArr);
console.log(copy.toString()); //我喜好編程
五、複製緩存數據
當須要將Buffer對象中保存的數據複製到另外一個Buffer對象中時,可使用Buffer對象的copy方法。
var str = "我喜好編程";
var buf = new Buffer(str);
buf.copy(targetBuffer,[targetStart],[sourceStart],[sourceEnd]);
targetBuffer:必選參數,用於指定複製的目標Buffer對象
[targetStart]:可選參數,用於指定從目標Buffer對象中從第幾個字節開始寫入數據,默認值爲0
[sourceStart]:可選參數,指定從複製源Buffer對象中獲取數據時的開始位置,默認0
[sourceEnd]:可選參數,指定從複製源Buffer對象中獲取數據的結束位置,默認爲複製Buffer對象的長度
var buf_a = Buffer("我喜好編程");
var buf_b = Buffer(128);
buf_b.fill(0);
buf_a.copy(buf_b,10);
六、Buffer類的類方法
Node.js爲Buffer類定義了三個類方法:
isBuffer(),用於判斷一個對象是否爲一個Buffer對象
語法:Buffer.isbuffer(obj);obj參數用於指定須要被判斷的對象,若是對象爲Buffer對象,方法返回true,不然返回false
var a = "aaa";
var b = Buffer(10);
Buffer.isBuffer(a);
Buffer.isBuffer(b);
byteLength(),用來計算一個指定字符串的字節數
語法:Buffer.byteLength(string,[encoding]);
string:必須參數,用於指定計算字節數的字符串
[encoding]:可選參數,用於指定按什麼編碼方式來計算字節數,默認utf8;
concat(),將幾個Buffer對象結合建立爲一個新的Buffer對象。
語法:Buffer.concat(list,[totalLength]);
list:必須參數,參數值爲一個存放了多個Buffer對象的數組;
totalLength:可選參數,用於指定被建立的Buffer對象的總長度,當省略該參數時,被建立的Buffer對象爲第一個參數數組中全部Buffer對象的長度的合計值。
若是第一個參數爲空數組,或第二個參數等於0,那麼concat方法返回一個長度爲0的Buffer對象。
若是第一個參數數組中只有一個Buffer對象,那麼concat方法直接返回該Buffer對象。
若是第一個參數值數值中擁有一個以上的Buffer對象,那麼concat方法返回被建立的Buffer對象。
isEncoding(),用於檢測一個字符串是否爲一個有效的編碼格式字符串;
語法:Buffer.isEncoding(encoding);
str1 = "utf16le";
Buffer.isEncoding(str1); //true