国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

使用node.js中的Buffer類處理二進制數據的方法

2019-11-19 18:48:58
字體:
來源:轉載
供稿:網友

前言

在Node.js中,定義了一個Buffer類,該類用來創建一個專門存放二進制數據的緩存區。這篇文章就詳細介紹了node.js中的Buffer類處理二進制數據的方法,下面話不多說,來看看詳細的介紹。

創建Buffer對象

第一種:直接使用一個數組來初始化緩存區

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

執行效果:


第二種:直接使用一個字符串來初始化緩存區

var str = 'hello'var buf = new Buffer(str)console.log(buf)

執行效果:


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

Buffer對象與字符串對象之間的相互轉換

(1)toString

可以使用Buffer對象的toString方法將Buffer對象中保存的數據轉換為字符串,使用方法如下:

buf.toString([encoding],[start],[end])

可選參數1:用于指定Buffer對象中保存的文字編碼格式,默認參數為UTF8。

可選參數2:指定被轉換數據的起始位置,以字節為單位。

可選參數3:指定被轉換數據的終止位置,以字節為單位。

示例代碼如下:

var buf = new Buffer('閣下何不隨風起')console.log(buf)console.log(buf.toString('utf8',9,12))console.log(buf.toString('utf8',12,buf.length))

效果如下:

控制臺

(2)write

有時我們需要向已經創建的Buffer對象寫入字符串,這時可以使用該Buffer對象的write方法。

buf.write(string,[offset],[length],[encodign])

必須參數1:指定需要寫入的字符串

可選參數2-3:指定字符串轉換為字節數據后的寫入位置,字節數據的書寫位置為從第1+offset個字節開始到offset+length個字節為止。

可選參數4:編碼格式,默認utf8

代碼如下:

var buf = new Buffer('閣下何不隨風起')buf.write('扶搖直上千萬里',0,buf.length)console.log(buf.toString())

運行效果如下:


控制臺

(3)StringDecoder對象

在Node.js中,也可以使用StringDecoder對象將Buffer對象中的數據轉換為字符串,該對象的作用與Buffer對象的toString方法的作用相同,但是對于utf8編碼格式的字符串提供了更好的支持。

在使用StringDecoder對象時,首先需要加載Node.js中的string_decoder模塊,方法如下:

var StringDecoder = require('string_decoder').StringDecoder

在加載了string_decoder模塊后,可以創建一個StringDecoder對象,方法如下:

var decoder = new StringDecoder([encoding])

在需要將Buffer對象中的數據轉換為字符串時,可以使用StringDecoder對象的write方法,write方法中可以使用一個參數,用于指定需要被轉換的Buffer對象,該方法會返回轉換后的字符串,代碼如下:

decoder.write(buffer)

好,來對比一下Buffer對象的toString方法和StringDecoder的write方法究竟誰對utf8支持的更好。

Buffer的toString方法如下:

//在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對象連接起來后再使用toString方法將其中的數據轉換為字符串,但是當Buffer對象的長度較大時,這種操作的性能將會變得比較地下。

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

StringDecoder的write方法如下:

//在UTF-8編碼格式下,將1個文字轉換為多個字節var buf = new Buffer('閣下何不隨風起')console.log(buf)//StringDecodervar StringDecoder = require('string_decoder').StringDecodervar 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))

運行效果如下:


控制臺

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

Buffer對象與JSON對象之間的相互轉換

在Node.js中,可以使用JSON.stringify方法將Buffer對象中保存的數據轉換為一個字符串,也可以使用JSON.parse方法將一個經過轉換后的字符串還原為一個數組。

復制緩存數據

當需要將Buffer對象中保存的二進制數據復制到另一個Buffer對象中時,可以使用Buffer對象的copy方法,copy方法的使用方法如下:

buf.copy(targetBuffer,[targetStart],[sourceStart],[sourceEnd])

必須參數1:指定復制的目標Buffer對象

可選參數2:指定目標Buffer對象中從第幾個字節開始寫入數據

可選參數3:指定從復制源Buffer對象中獲取數據時的開始位置,默認0

可選參數4:指定從復制源Buffer對象中獲取數據時的結束位置,默認值為復制源對象的長度

示例代碼如下:

//目標:將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)//輸出復制后的buf2console.log(buf2)//以字符串的形式打印buf2var StringDecoder = require('string_decoder').StringDecodervar decoder = new StringDecoder()console.log(decoder.write(buf2))

運行效果如下:


控制臺

Buffer類的類方法

(1)isBuffer方法

用于判斷一個對象是否為一個Buffer對象,使用方法如下:

Buffer.isBuffer(objc)

示例代碼如下:

var a = 'abcde'var b = new Buffer(10)console.log(typeof a)console.log(typeof b)console.log('---我是奇妙的分隔符----')console.log(Buffer.isBuffer(a))console.log(Buffer.isBuffer(b))

運行結果:


控制臺

(2)byteLength方法

可以使用ByteLength方法計算一個指定字符串的字節數,使用方法如下:

Buffer.byteLength(string,[encoding])

必須參數1:指定需要計算字節數的字符串

可選參數2:編碼格式,默認utf8

示例代碼如下:

var str = '閣下何不隨風起'console.log(str.length)console.log(Buffer.byteLength(str,'utf8'))console.log(Buffer.byteLength(str,'base64'))console.log(Buffer.byteLength(str,'utf16le'))

運行結果如下:


控制臺

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

運行效果如下:


控制臺

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: SHOW| 木兰县| 若尔盖县| 龙胜| 越西县| 太原市| 山东| 佳木斯市| 贺州市| 龙游县| 湟源县| 福州市| 嘉黎县| 邹平县| 西丰县| 虞城县| 天柱县| 阿勒泰市| 阿拉善左旗| 米脂县| 贵州省| 永州市| 英吉沙县| 藁城市| 沙雅县| 华亭县| 花莲县| 桑植县| 射阳县| 合作市| 万载县| 河间市| 攀枝花市| 涞水县| 当涂县| 金坛市| 游戏| 庆城县| 韶山市| 安福县| 龙南县|