前言
在Node.js中,定義了一個Buffer類,該類別用來建立一個專門存放二進位資料的快取區。這篇文章就詳細介紹了node.js中的Buffer類別處理二進位資料的方法,下面話不多說,來看看詳細的介紹。
建立Buffer物件
第一種:直接使用一個陣列來初始化快取區
var arr = [0,1,2] var buf = new Buffer(arr) console.log(buf)
執行效果:
:使用一個原始效果來初始化 在Node.js中,將自動執行字串的輸入輸出時的編碼與解碼處理,預設使用UTF8編碼。 Buffer物件與字串物件之間的相互轉換var str = 'hello' var buf = new Buffer(str) console.log(buf)
可選參數1:用於指定Buffer物件中儲存的文字編碼格式,預設參數為UTF8。
可選參數2:指定被轉換資料的起始位置,以位元組為單位。
可選參數3:指定被轉換資料的終止位置,以位元組為單位。
範例程式碼如下:
buf.toString([encoding],[start],[end])
(2)write
有時我們需要向已經建立的Buffer物件寫入字串,這時可以使用該Buffer物件的write方法。
var buf = new Buffer('阁下何不随风起') console.log(buf) console.log(buf.toString('utf8',9,12)) console.log(buf.toString('utf8',12,buf.length))
必須參數1:指定需要寫入的字串
選用參數2-3:指定字串轉換為位元組資料後的寫入位置,位元組資料的書寫位置為從第1+offset個位元組開始到offset+length個位元組為止。
可選參數4:編碼格式,預設utf8
程式碼如下:
buf.write(string,[offset],[length],[encodign])
在使用StringDecoder物件時,首先需要載入Node.js中的string_decoder模組,方法如下:
var buf = new Buffer('阁下何不随风起') buf.write('扶摇直上千万里',0,buf.length) console.log(buf.toString())
在載入了string_decoder
在載入了string_decoder
在需要將Buffer對像中的資料轉換為字串時,可以使用StringDecoder對象的write方法,write方法中可以使用一個參數,用於指定需要被轉換的Buffer對象,該方法會傳回轉換後的字串,程式碼如下:
var StringDecoder = require('string_decoder').StringDecoder
好,來比較一下Buffer物件的toString方法和StringDecoder的write方法究竟誰對utf8支援的更好。
Buffer的toString方法如下:
var decoder = new StringDecoder([encoding])當然,也可以用如下方法將兩個buffer物件連接起來後再使用toString方法將其中的資料轉換為字串,但是當Buffer物件的長度較大時,這種操作的性能將會變得比較地下。
decoder.write(buffer)
StringDecoder的write方法如下:
//在UTF-8编码格式下,将1个文字转换为多个字节 var buf = new Buffer('阁下何不随风起') console.log(buf) //0x是我手动加的 var str1 = new Buffer([0xe9, 0x98, 0x81, 0xe4, 0xb8, 0x8b, 0xe4, 0xbd]) console.log(str1.toString()) var str2 = new Buffer([0x95, 0xe4, 0xb8, 0x8d, 0xe9, 0x9a, 0x8f, 0xe9, 0xa3, 0x8e, 0xe8, 0xb5, 0xb7]) console.log(str2.toString())
誰支持的更好一眼就可以看出來了。
在Node.js中,可以使用JSON.stringify方法將Buffer物件中保存的資料轉換為一個字串,也可以使用JSON.parse方法將一個經過轉換後的字串還原為一個陣列。
複製快取資料
當需要將Buffer物件中保存的二進位資料複製到另一個Buffer物件中時,可以使用Buffer物件的copy方法,copy方法的使用方法如下:
Buffer.concat([str1,str2]).toString()
必須參數1:指定複製的目標Buffer物件
選用參數2:指定目標Buffer物件中從第幾個位元組開始寫入資料
選用參數3:指定從複製來源Buffer物件中取得資料時的起始位置,預設為0//在UTF-8编码格式下,将1个文字转换为多个字节 var buf = new Buffer('阁下何不随风起') console.log(buf) //StringDecoder var StringDecoder = require('string_decoder').StringDecoder var decoder = new StringDecoder() //0x是我手动加的 var str1 = new Buffer([0xe9, 0x98, 0x81, 0xe4, 0xb8, 0x8b, 0xe4, 0xbd]) console.log(decoder.write(str1)) var str2 = new Buffer([0x95, 0xe4, 0xb8, 0x8d, 0xe9, 0x9a, 0x8f, 0xe9, 0xa3, 0x8e, 0xe8, 0xb5, 0xb7]) console.log(decoder.write(str2))
(1)isBuffer方法
用於判斷一個物件是否為一個Buffer對象,使用方法如下:
buf.copy(targetBuffer,[targetStart],[sourceStart],[sourceEnd])
控制台範例程式碼
(2)byteLength方法
可以使用ByteLength方法計算一個指定字串的位元組數,使用方法如下:
//目标:将buf1 Buffer对象中的内容复制到buf2 Buffer对象中 //复制的目标起始位置为buf2 Buffer对象中的第11个字节处(第11个字节出开始写入) var buf1 = new Buffer('阁下何不随风起') console.log(buf1) var buf2 = new Buffer(128) buf2.fill(0) console.log(buf2) //关键代码 buf1.copy(buf2,10) //输出复制后的buf2 console.log(buf2) //以字符串的形式打印buf2 var StringDecoder = require('string_decoder').StringDecoder var decoder = new StringDecoder() console.log(decoder.write(buf2))
範例程式碼如下:
Buffer.isBuffer(objc)
(3)isEncoding方法
isEncoding方法用于检测一个字符串是否为一个有效的编码格式字符串。使用方法如下:
Buffer.isEncoding(encoding)
在isEncoding方法中,使用一个参数,用于指定需要被检测的字符串,如果该字符串为有效的编码格式字符串,则方法返回true,如果该字符串不是一个有效的编码格式字符串,则方法返回false。
示例代码如下:
var str1 = 'utf8' console.log(Buffer.isEncoding(str1)) var str2 = 'utf16le' console.log(Buffer.isEncoding(str2)) var str3= 'utf16e' console.log(Buffer.isEncoding(str3))