国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
ArrayBuffer
是什麼
TypedArray 視圖
和Buffer 的關(guān)係
Buffer 結(jié)構(gòu)
模組結(jié)構(gòu)
物件結(jié)構(gòu)
Buffer 的建立
Buffer.alloc 與Buffer.allocUnsafe
Buffer.alloc(size [, fill [, encoding]])
Buffer.allocUnsafe(size)
Buffer.from
Buffer 和字串的轉(zhuǎn)換
字串轉(zhuǎn)Buffer
Buffer 轉(zhuǎn)字串
首頁 web前端 js教程 深入了解Node中的Buffer

深入了解Node中的Buffer

Apr 25, 2023 pm 07:49 PM
前端 node.js

深入了解Node中的Buffer

在 Stream 篇結(jié)中,我們留下了一個(gè)問題,下述程式碼輸出的 chunk 是什麼東西?

深入了解Node中的Buffer

透過列印,我們發(fā)現(xiàn) chunk 是 Buffer 對(duì)象,其中的元素是16進(jìn)位的兩位數(shù),也就是0~255的數(shù)值。 【相關(guān)教學(xué)推薦:nodejs影片教學(xué)程式設(shè)計(jì)教學(xué)

Untitled 1.png

#說明在Stream 中流動(dòng)的資料就是Buffer,那以下就讓我們來探究一下Buffer 的真實(shí)面目!

? Node 中為什麼要引入Buffer?

最開始的時(shí)候JS 只在瀏覽器端運(yùn)行,對(duì)於Unicode 編碼的字串容易處理,但是對(duì)於二進(jìn)制和非Unicode 編碼的字串處理困難。而二進(jìn)制是電腦最底層的資料格式,視訊/音訊/程式/網(wǎng)路包都是以二進(jìn)位來儲(chǔ)存的。所以 Node 需要引入一個(gè)物件來操作二進(jìn)位,因此 Buffer 誕生了,用於 TCP流/檔案系統(tǒng)等操作處理二進(jìn)位位元組。

由於Buffer 在Node 中過於常用,所以在Node 啟動(dòng)的時(shí)候已經(jīng)引入了Buffer,無需使用require()

ArrayBuffer

是什麼

ArrayBuffer 是內(nèi)存之中的一段二進(jìn)位數(shù)據(jù),本身不能夠操作內(nèi)存,需要透過TypedArray 物件DataView 來操作。將緩衝區(qū)中的資料表示為特定的格式,並透過這些格式來讀寫緩衝區(qū)的內(nèi)容,其部署了數(shù)組接口,可以使用數(shù)組的方式來操作資料

TypedArray 視圖

最常用的是TypeArray 視圖,用來讀寫簡(jiǎn)單類型的ArrayBuffer,例如Uint8Array(無符號(hào)8位元整數(shù))陣列視圖,?Int16Array(16位元整數(shù))陣列視圖

和Buffer 的關(guān)係

NodeJS 中的Buffer 類別其實(shí)是Uint8Array 的實(shí)作。

Buffer 結(jié)構(gòu)

Buffer 是一個(gè)類似Array 的對(duì)象,但是它主要用於操作位元組

模組結(jié)構(gòu)

Buffer 是JS 和C 結(jié)合的模組,性能部分都由C 實(shí)現(xiàn),非性能部分都是JS 實(shí)現(xiàn)的Untitled 2.png

Buffer 所佔(zhàn)用的記憶體不是由V8 分配的,屬於堆外記憶體。

物件結(jié)構(gòu)

Buffer 物件類似數(shù)組,其元素為16進(jìn)位的兩位數(shù),即0~255的數(shù)值

Untitled 3.png

#從這個(gè)例子能夠看出,不同字元在Buffer 中佔(zhàn)據(jù)的位元組是不一樣的,在UTF-8 編碼下,中文佔(zhàn)據(jù)3個(gè)字節(jié),英文和半角標(biāo)號(hào)佔(zhàn)用1個(gè)位元組

? 輸入的元素是小數(shù)/負(fù)數(shù)/超出255會(huì)發(fā)生什麼事?

Untitled 4.png

對(duì)於上述這種情況,Buffer 的處理為:

  • 給元素的賦值小於0, 就將該值逐次加256,直到得到一個(gè)0到255之間的整數(shù)
  • 如果得到的數(shù)值大於255,就逐次減256,直到得到0~255區(qū)間內(nèi)的數(shù)值
  • 如果是小數(shù),只保留整數(shù)部分

Buffer 裡面為什麼展示的是16進(jìn)位

其實(shí)在記憶體儲(chǔ)存的依舊是二進(jìn)制數(shù),只是Buffer 在顯示這內(nèi)存資料的時(shí)候採用了16進(jìn)位

大小為2位元組的buffer,一共有16 bit ,例如是00000001 00100011,如果直接這樣顯示不太方便就轉(zhuǎn)成為了16進(jìn)位<buffer></buffer>

Buffer 的建立

Buffer.alloc 與Buffer.allocUnsafe

# 建立固定大小的buffer

Buffer.alloc(size [, fill [, encoding]])

  • size 新 Buffer 的所需長(zhǎng)度
  • fill 用於預(yù)先填入新 Buffer 的值。預(yù)設(shè)值: 0
  • encoding 如果 fill 是一個(gè)字串,則這是它的字元編碼。預(yù)設(shè)值: utf8

Untitled 5.png

Buffer.allocUnsafe(size)

分配一個(gè)大小為size 位元組的Buffer,allocUnsafe 執(zhí)行速度比alloc 快,我們發(fā)現(xiàn)其結(jié)果並不像Buffer.alloc 那樣都初始化為00

Untitled 6.png

#當(dāng)呼叫allocUnsafe 時(shí)分配的記憶體段尚未初始化,這樣分配記憶體速度很塊,但分配到的記憶體片段可能包含舊資料。如果使用的時(shí)候不覆寫這些舊資料就可能造成記憶體洩露,雖然速度快,盡量避免使用

Buffer 模組會(huì)預(yù)先分配一個(gè)內(nèi)部的大小為?Buffer.poolSize 的Buffer 實(shí)例,作為快速分配的記憶體池,用於使用allocUnsafe 建立新的Buffer 實(shí)例

Buffer.from

根據(jù)內(nèi)容直接建立Buffer

  • Buffer.from(string [, encoding] )
  • Buffer.from(array)
  • Buffer.from(buffer)

Untitled 7.png

##Buffer.allocUnsafe 的記憶體機(jī)制

為了有效地使用申請(qǐng)來的內(nèi)存,Node.js 採用了slab 機(jī)制進(jìn)行預(yù)先申請(qǐng)、事後分配,是一種動(dòng)態(tài)的管理機(jī)制

使用?Buffer.alloc(size)?傳入一個(gè)指定的?size 就會(huì)申請(qǐng)一塊固定大小的記憶體區(qū)域,slab 有以下三種狀態(tài)

    full: 完全分配狀態(tài)
  • partial:部分分配狀態(tài)
  • # empty:沒有被指派狀態(tài)
Node.js 使用8 KB 為界限來區(qū)分是小物件還是大物件

Untitled 8.png

Buffer在創(chuàng)建的時(shí)候大小就已經(jīng)被確定了且無法調(diào)整!

分配小物件

如果分配的物件小於8KB,Node 會(huì)以小物件的方式來進(jìn)行分配

Buffer 的分配過程中主要使用一個(gè)局部變數(shù)?pool 作為中間處理對(duì)象,處於分配狀態(tài)的?slab 單元都指向它。以下是指派一個(gè)全新的slab 單元的操作,它將新申請(qǐng)的SlowBuffer 物件指向它

Untitled 9.png

一個(gè)slab 單元

Untitled 10.png

分配一個(gè)2KB 大小的Buffer

建立一個(gè)2KB 的buffer後,一個(gè)slab 單元記憶體如下:

Untitled 11.png

這個(gè)分配過程是由allocate方法完成

Untitled 12.png

當(dāng)我們建立了一個(gè)2KB 的buffer 之後,目前slab 狀態(tài)為partial

再次建立buffer 的時(shí)候,會(huì)去判斷目前slab 剩餘空間是否足夠。如果足夠,使用剩餘空間,並更新slab 的分配狀態(tài)

如果slab 空間不夠,就會(huì)建構(gòu)新的slab,原slab 中剩餘的空間造成浪費(fèi)

分配大物件

如果有超過8KB 的buffer,直接會(huì)走到creatUnsafeBuffer 函數(shù),分配一個(gè)slab 單元,這個(gè)slab 單元將會(huì)被這個(gè)大Buffer 物件獨(dú)佔(zhàn)

allocate 分配機(jī)制如圖

Untitled 13.png

#Buffer 的記憶體分配機(jī)制

Untitled 14.png

#Buffer 和字元編碼

透過使用字元編碼,可實(shí)現(xiàn)Buffer 實(shí)例與JavaScript 字串之間的相互轉(zhuǎn)換

Untitled 15.png

Node 中目前支援utf8、ucs2、utf16le、latin1、ascii、base64、hex、base64Url 八種編碼方式,具體實(shí)作

Untitled 16.png

#針對(duì)於每一種不同的編碼方案都會(huì)用實(shí)作一系列api,傳回會(huì)有不同的結(jié)果,Node.js 會(huì)根據(jù)傳入的encoding 來傳回不同的物件

Buffer 和字串的轉(zhuǎn)換

字串轉(zhuǎn)Buffer

主要透過上述講的Buffer.from 方法,預(yù)設(shè)的encoding 方式為utf-8

Buffer 轉(zhuǎn)字串

Untitled 17.png

#? 為什麼會(huì)出現(xiàn)亂碼呢?如何解決這個(gè)問題呢?

按著讀取來說,我們每次讀取的長(zhǎng)度為4,chunk輸出如下

Untitled 18.png

#對(duì)於data = chunk等價(jià)於data = data.toString chunk.toString

#由於一個(gè)中文佔(zhàn)據(jù)三個(gè)字節(jié),第一個(gè)chunk 中的第四個(gè)位元組會(huì)顯示亂碼,第二個(gè)chunk 的第一第二個(gè)位元組也無法形成文字等等,所以會(huì)展示亂碼問題

更多node相關(guān)知識(shí),請(qǐng)?jiān)煸L:nodejs 教學(xué)!

以上是深入了解Node中的Buffer的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

PHP與Vue:完美搭檔的前端開發(fā)利器 PHP與Vue:完美搭檔的前端開發(fā)利器 Mar 16, 2024 pm 12:09 PM

PHP與Vue:完美搭檔的前端開發(fā)利器在當(dāng)今網(wǎng)路快速發(fā)展的時(shí)代,前端開發(fā)變得愈發(fā)重要。隨著使用者對(duì)網(wǎng)站和應(yīng)用的體驗(yàn)要求越來越高,前端開發(fā)人員需要使用更有效率和靈活的工具來創(chuàng)建響應(yīng)式和互動(dòng)式的介面。 PHP和Vue.js作為前端開發(fā)領(lǐng)域的兩個(gè)重要技術(shù),搭配起來可以稱得上是完美的利器。本文將探討PHP和Vue的結(jié)合,以及詳細(xì)的程式碼範(fàn)例,幫助讀者更好地理解和應(yīng)用這兩

Go語言前端技術(shù)探秘:前端開發(fā)新視野 Go語言前端技術(shù)探秘:前端開發(fā)新視野 Mar 28, 2024 pm 01:06 PM

Go語言作為一種快速、高效的程式語言,在後端開發(fā)領(lǐng)域廣受歡迎。然而,很少有人將Go語言與前端開發(fā)聯(lián)繫起來。事實(shí)上,使用Go語言進(jìn)行前端開發(fā)不僅可以提高效率,還能為開發(fā)者帶來全新的視野。本文將探討使用Go語言進(jìn)行前端開發(fā)的可能性,並提供具體的程式碼範(fàn)例,幫助讀者更了解這一領(lǐng)域。在傳統(tǒng)的前端開發(fā)中,通常會(huì)使用JavaScript、HTML和CSS來建立使用者介面

Django是前端還是後端?一探究竟! Django是前端還是後端?一探究竟! Jan 19, 2024 am 08:37 AM

Django是一個(gè)由Python編寫的web應(yīng)用框架,它強(qiáng)調(diào)快速開發(fā)和乾淨(jìng)方法。儘管Django是web框架,但要回答Django是前端還是後端這個(gè)問題,需要深入理解前後端的概念。前端是指使用者直接和互動(dòng)的介面,後端是指伺服器端的程序,他們透過HTTP協(xié)定進(jìn)行資料的互動(dòng)。在前端和後端分離的情況下,前後端程式可以獨(dú)立開發(fā),分別實(shí)現(xiàn)業(yè)務(wù)邏輯和互動(dòng)效果,資料的交

C#開發(fā)經(jīng)驗(yàn)分享:前端與後端協(xié)同開發(fā)技巧 C#開發(fā)經(jīng)驗(yàn)分享:前端與後端協(xié)同開發(fā)技巧 Nov 23, 2023 am 10:13 AM

身為C#開發(fā)者,我們的開發(fā)工作通常包括前端和後端的開發(fā),而隨著技術(shù)的發(fā)展和專案的複雜性提高,前端與後端協(xié)同開發(fā)也變得越來越重要和複雜。本文將分享一些前端與後端協(xié)同開發(fā)的技巧,以幫助C#開發(fā)者更有效率地完成開發(fā)工作。確定好介面規(guī)範(fàn)前後端的協(xié)同開發(fā)離不開API介面的交互。要確保前後端協(xié)同開發(fā)順利進(jìn)行,最重要的是定義好介面規(guī)格。接口規(guī)範(fàn)涉及到接口的命

前端面試官常問的問題 前端面試官常問的問題 Mar 19, 2024 pm 02:24 PM

在前端開發(fā)面試中,常見問題涵蓋廣泛,包括HTML/CSS基礎(chǔ)、JavaScript基礎(chǔ)、框架和函式庫、專案經(jīng)驗(yàn)、演算法和資料結(jié)構(gòu)、效能最佳化、跨域請(qǐng)求、前端工程化、設(shè)計(jì)模式以及新技術(shù)和趨勢(shì)。面試官的問題旨在評(píng)估候選人的技術(shù)技能、專案經(jīng)驗(yàn)以及對(duì)行業(yè)趨勢(shì)的理解。因此,應(yīng)試者應(yīng)充分準(zhǔn)備這些方面,以展現(xiàn)自己的能力和專業(yè)知識(shí)。

前端怎麼實(shí)現(xiàn)即時(shí)通訊 前端怎麼實(shí)現(xiàn)即時(shí)通訊 Oct 09, 2023 pm 02:47 PM

實(shí)作即時(shí)通訊的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。詳細(xì)介紹:1、WebSocket,它可以在客戶端和伺服器之間建立持久連接,實(shí)現(xiàn)即時(shí)的雙向通信,前端可以使用WebSocket API來創(chuàng)建WebSocket連接,並透過發(fā)送和接收訊息來實(shí)現(xiàn)即時(shí)通訊;2、Long Polling,是一種模擬即時(shí)通訊的技術(shù)等等

Django:前端和後端開發(fā)都能搞定的神奇框架! Django:前端和後端開發(fā)都能搞定的神奇框架! Jan 19, 2024 am 08:52 AM

Django:前端和後端開發(fā)都能搞定的神奇框架! Django是一個(gè)高效、可擴(kuò)展的網(wǎng)路應(yīng)用程式框架。它能夠支援多種Web開發(fā)模式,包括MVC和MTV,可以輕鬆地開發(fā)出高品質(zhì)的Web應(yīng)用程式。 Django不僅支援後端開發(fā),還能夠快速建構(gòu)出前端的介面,透過模板語言,實(shí)現(xiàn)靈活的視圖展示。 Django把前端開發(fā)和後端開發(fā)融合成了一種無縫的整合,讓開發(fā)人員不必專門學(xué)習(xí)

Golang與前端技術(shù)結(jié)合:探討Golang如何在前端領(lǐng)域發(fā)揮作用 Golang與前端技術(shù)結(jié)合:探討Golang如何在前端領(lǐng)域發(fā)揮作用 Mar 19, 2024 pm 06:15 PM

Golang與前端技術(shù)結(jié)合:探討Golang如何在前端領(lǐng)域發(fā)揮作用,需要具體程式碼範(fàn)例隨著互聯(lián)網(wǎng)和行動(dòng)應(yīng)用的快速發(fā)展,前端技術(shù)也愈發(fā)重要。而在這個(gè)領(lǐng)域中,Golang作為一門強(qiáng)大的後端程式語言,也可以發(fā)揮重要作用。本文將探討Golang如何與前端技術(shù)結(jié)合,以及透過具體的程式碼範(fàn)例來展示其在前端領(lǐng)域的潛力。 Golang在前端領(lǐng)域的角色作為一門高效、簡(jiǎn)潔且易於學(xué)習(xí)的

See all articles