首頁  >  文章  >  web前端  >  使用node.js中的Buffer類別處理二進位資料的方法

使用node.js中的Buffer類別處理二進位資料的方法

高洛峰
高洛峰原創
2016-12-05 11:08:14950瀏覽

前言

在Node.js中,定義了一個Buffer類,該類別用來建立一個專門存放二進位資料的快取區。這篇文章就詳細介紹了node.js中的Buffer類別處理二進位資料的方法,下面話不多說,來看看詳細的介紹。

建立Buffer物件

第一種:直接使用一個陣列來初始化快取區

var arr = [0,1,2]
var buf = new Buffer(arr)
console.log(buf)

 執行效果:

使用node.js中的Buffer類別處理二進位資料的方法

:使用一個原始效果來初始化

使用node.js中的Buffer類別處理二進位資料的方法

在Node.js中,將自動執行字串的輸入輸出時的編碼與解碼處理,預設使用UTF8編碼。

Buffer物件與字串物件之間的相互轉換


(1)toString


可以使用Buffer物件的toString方法將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])

   


Buffer物件中的資料轉換為字串,該物件的作用與Buffer物件的toString方法的作用相同,但是對於utf8編碼格式的字串提供了更好的支援。


在使用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())

誰支持的更好一眼就可以看出來了。

Buffer物件與JSON物件之間的相互轉換

在Node.js中,可以使用JSON.stringify方法將Buffer物件中保存的資料轉換為一個字串,也可以使用JSON.parse方法將一個經過轉換後的字串還原為一個陣列。

複製快取資料

當需要將Buffer物件中保存的二進位資料複製到另一個Buffer物件中時,可以使用Buffer物件的copy方法,copy方法的使用方法如下:

Buffer.concat([str1,str2]).toString()

必須參數1:指定複製的目標Buffer物件

選用參數2:指定目標Buffer物件中從第幾個位元組開始寫入資料

選用參數3:指定從複製來源Buffer物件中取得資料時的起始位置,預設為0


選用參數4:指定從複製來源Buffer物件中取得資料時的結束位置,預設值為複製來源物件的長度


範例程式碼如下:

//在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))

   


選用參數2:編碼格式,預設utf8

範例程式碼如下:

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))

   



陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn