摘要:對(duì)象對(duì)象是處理二進(jìn)制數(shù)據(jù)的一個(gè)接口。它是原生提供的全局對(duì)象,可以直接使用,不需要。自有的字符串遠(yuǎn)遠(yuǎn)不能滿足這些要求,于是對(duì)象應(yīng)運(yùn)而生。的轉(zhuǎn)換對(duì)象可以與字符串相互轉(zhuǎn)換,目前支持的字符串編碼類型有一下幾種。
Buffer對(duì)象
Buffer對(duì)象是Node處理二進(jìn)制數(shù)據(jù)的一個(gè)接口。它是Node原生提供的全局對(duì)象,可以直接使用,不需要require("buffer")。雖然javascript對(duì)于字符串的操作十分友好。但是,在node中,很多的操作都會(huì)處理大量的二進(jìn)制數(shù)據(jù),比如文件處理,網(wǎng)絡(luò)協(xié)議處理,圖片處理。javascript自有的字符串遠(yuǎn)遠(yuǎn)不能滿足這些要求,于是Buffer對(duì)象應(yīng)運(yùn)而生。
Buffer是一個(gè)典型的javascript和c++結(jié)合的模塊,它將性能相關(guān)的部分用c++實(shí)現(xiàn),而將非性能相關(guān)的部分用js實(shí)現(xiàn)。node在進(jìn)程啟動(dòng)的時(shí)候就已經(jīng)加載了Buffer,所以無需require。
內(nèi)存分配Buffer對(duì)象的內(nèi)存分配不是在V8的堆內(nèi)存中,而是在node的c++層面實(shí)現(xiàn)的內(nèi)存的申請(qǐng)的。node采用了slab分配機(jī)制,動(dòng)態(tài)內(nèi)存管理,slab包含三種狀態(tài),slab具有如下三種狀態(tài):
full:完全分配狀態(tài)
partial: 部分分配狀態(tài)
empty:沒有被分配狀態(tài) 。
我們可以指定Buffer對(duì)象的大小
new Buffer(size)
node以8KB為界限區(qū)分Buffer是大對(duì)象還是小對(duì)象(Buffer.poolSize=8*1024),即8kb為slab單元大小,js以它為單元分配內(nèi)存。
Buffer對(duì)象Buffer對(duì)象類似于數(shù)組,它的元素為16進(jìn)制的兩位數(shù),即0-255的數(shù)值。
上面的代碼會(huì),新建一個(gè)保存str字符串的buffer 對(duì)象。
使用指定的編碼方式將字符串寫入buffer,然后返回實(shí)際寫入的大小。如果buffer 空間不足, 則只會(huì)寫入部分字符串。在本例中使用"utf8"編碼,這種方式不會(huì)寫入半個(gè)字符。
Buffer對(duì)象可以與字符串相互轉(zhuǎn)換,目前支持的字符串編碼類型有一下幾種。
ASCII
UTF-8
UTF-16LE/UCS-2
Base64
Binary
Hex
字符串轉(zhuǎn)buffer,使用構(gòu)造函數(shù)new Buffer(str,[encoding]),默認(rèn)是UTF-8編碼。
Buffer轉(zhuǎn)字符串也很簡(jiǎn)單,Buffer對(duì)象的toString方法可以將Buffer轉(zhuǎn)成字符串。
var buf = new Buffer("Buffer Test") buf.toString()Buffer拼接
正確的拼接方式是用一個(gè)數(shù)組來存儲(chǔ)接收到的所有Buffer片段,并記錄所有片段的總長(zhǎng)度,然后調(diào)用Buffer的concat()方法生成一個(gè)合并的Buffer對(duì)象。
var chunks = [] var size = 0 res.on("data", function(chunk) { chunks.push(chunk) size += chunk.length }) res.on("end", function() { var buf = Buffer.concat(chunks, size) var str = iconv.decode(buf, "utf8") console.log(str) })
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/92354.html
摘要:對(duì)象與字符串對(duì)象的方法將對(duì)象中保存的數(shù)據(jù)轉(zhuǎn)換為字符串第一個(gè)參數(shù)用于指定對(duì)象中保存的文字編碼格式,默認(rèn)參數(shù)值為第二個(gè)參數(shù)和第三個(gè)參數(shù)用于指定被轉(zhuǎn)換數(shù)據(jù)的起始位置與結(jié)束位置,不包含結(jié)束位置對(duì)象的方法向已經(jīng)創(chuàng)建的對(duì)象中寫入字符串第一個(gè)參數(shù)為指定需 Buffer對(duì)象與字符串 1. Buffer對(duì)象的toString()方法 將Buffer對(duì)象中保存的數(shù)據(jù)轉(zhuǎn)換為字符串 toString([e...
摘要:然而,在處理流或文件流時(shí),必須要處理二進(jìn)制數(shù)據(jù)。因此,在中,定義了一個(gè)類,該類用來創(chuàng)建一個(gè)專門存放二進(jìn)制數(shù)據(jù)的緩存區(qū)。因?yàn)樵谟?jì)算字符串的長(zhǎng)度時(shí),以位子作為一個(gè)單位,而在計(jì)算緩存區(qū)的長(zhǎng)度時(shí),以字節(jié)作為一個(gè)單位。 buffer對(duì)象 1. 什么是buffer 在客戶端Javascript腳本代碼中,對(duì)于二進(jìn)制數(shù)據(jù)沒有提供一個(gè)很好的支持。然而,在處理TCP流或文件流時(shí),必須要處理二進(jìn)制數(shù)據(jù)...
摘要:在創(chuàng)建時(shí)大小已經(jīng)被確定且是無法調(diào)整的,在內(nèi)存分配這塊是由層面提供而不是具體后面會(huì)講解。在這里不知道你是否認(rèn)為這是很簡(jiǎn)單的但是上面提到的一些關(guān)鍵詞二進(jìn)制流緩沖區(qū),這些又都是什么呢下面嘗試做一些簡(jiǎn)單的介紹。 showImg(https://segmentfault.com/img/remote/1460000019894717?w=1280&h=850); 多數(shù)人都擁有自己不了解的能力和機(jī)...
摘要:前面說的輸入輸出流都是阻塞式的而且傳統(tǒng)的輸入輸出流都是通過字節(jié)的移動(dòng)來處理即使不直接處理字節(jié)底層還是依賴字節(jié)處理也就是說面向輸輸出系統(tǒng)一次只能處理一個(gè)字節(jié)所以效率并不高新概述新使用不同的方式來處理輸入輸出采用內(nèi)存映射文件的方式來處理輸入輸出 前面說的輸入輸出流都是阻塞式的.而且傳統(tǒng)的輸入輸出流都是通過字節(jié)的移動(dòng)來處理(即使不直接處理字節(jié),底層還是依賴字節(jié)處理),也就是說面向輸輸出系統(tǒng)一...
摘要:一個(gè)匿名函數(shù),執(zhí)行,事件全部完成,執(zhí)行最后一句,程序執(zhí)行完畢。這個(gè)事件的監(jiān)聽器為一個(gè)匿名函數(shù),事件名稱為,當(dāng)秒以后被觸發(fā)先對(duì)象發(fā)送一個(gè)事件觸發(fā)了匿名函數(shù)即監(jiān)聽器,監(jiān)聽器被執(zhí)行。 node.js事件循環(huán) node.js單進(jìn)程,單線程的程序每一個(gè)api都支持回調(diào)所有的事件機(jī)制都是設(shè)計(jì)模式中的 一共是23種設(shè)計(jì)模式 http://design-patterns.readth...一個(gè)對(duì)象發(fā)生...
閱讀 3106·2021-11-18 10:02
閱讀 2618·2021-10-13 09:47
閱讀 3034·2021-09-22 15:07
閱讀 791·2019-08-30 15:43
閱讀 1810·2019-08-30 10:59
閱讀 1686·2019-08-29 15:34
閱讀 1703·2019-08-29 15:06
閱讀 439·2019-08-29 13:28