亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
ArrayBuffer
是什么
TypedArray 視圖
和 Buffer 的關(guān)系
Buffer 結(jié)構(gòu)
模塊結(jié)構(gòu)
對象結(jié)構(gòu)
Buffer 的創(chuàng)建
Buffer.alloc 和 Buffer.allocUnsafe
Buffer.alloc(size [, fill [, encoding]])
Buffer.allocUnsafe(size)
Buffer.from
Buffer.allocUnsafe 的內(nèi)存機制
分配小對象
分配一個 2KB 大小的 Buffer
分配大對象
Buffer 的內(nèi)存分配機制
Buffer 和字符編碼
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é)中,我們留下了一個問題,下述代碼輸出的 chunk 是一個什么東西?

深入了解Node中的Buffer

通過打印,我們發(fā)現(xiàn) chunk 是 Buffer 對象,其中的元素是16進制的兩位數(shù),即0~255的數(shù)值?!鞠嚓P(guān)教程推薦:nodejs視頻教程編程教學

Untitled 1.png

說明在 Stream 中流動的數(shù)據(jù)就是 Buffer,那下面就讓我們來探究一下 Buffer 的真實面目!

? Node 中為什么要引入 Buffer?

最開始的時候 JS 只在瀏覽器端運行,對于 Unicode 編碼的字符串容易處理,但是對于二進制和非 Unicode 編碼的字符串處理困難。并且二進制是計算機最底層的數(shù)據(jù)格式,視頻/音頻/程序/網(wǎng)絡(luò)包都是以二進制來存儲的。所以 Node 需要引入一個對象來操作二進制,因此 Buffer 誕生了,用于 TCP流/文件系統(tǒng)等操作處理二進制字節(jié)。

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

ArrayBuffer

是什么

ArrayBuffer 是內(nèi)存之中的一段二進制數(shù)據(jù),本身不能夠操作內(nèi)存,需要通過TypedArray 對象或者 DataView 來操作。將緩沖區(qū)中的數(shù)據(jù)表示為特定的格式,并通過這些格式來讀寫緩沖區(qū)的內(nèi)容,其部署了數(shù)組接口,可以使用數(shù)組的方式來操作數(shù)據(jù)

TypedArray 視圖

最常用的是 TypeArray 視圖,用于讀寫簡單類型的 ArrayBuffer,比如 Uint8Array(無符號8位整數(shù))數(shù)組視圖,?Int16Array(16位整數(shù))數(shù)組視圖

和 Buffer 的關(guān)系

NodeJS 中的 Buffer 類其實是 Uint8Array 的實現(xiàn)。

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

Buffer 是一個類似 Array 的對象,但是它主要用于操作字節(jié)

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

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

Buffer 所占用的內(nèi)存不是由 V8 分配的,屬于堆外內(nèi)存。

對象結(jié)構(gòu)

Buffer 對象類似數(shù)組,其元素是16進制的兩位數(shù),即0~255的數(shù)值

Untitled 3.png

從這個例子能夠看出,不同字符在 Buffer 中占據(jù)的字節(jié)是不一樣的,在 UTF-8 編碼下,中文占據(jù)3個字節(jié),英文和半角標號占用1個字節(jié)

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

Untitled 4.png

對于上述這種情況,Buffer 的處理為:

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

Buffer 里面為什么展示的是16進制

其實在內(nèi)存存儲的依舊是二進制數(shù),只是 Buffer 在顯示這內(nèi)存數(shù)據(jù)的時候采用了16進制

大小為2字節(jié)的 buffer,一共有16 bit ,比如是00000001 00100011,如果直接這樣顯示不太方便就轉(zhuǎn)成為了16進制<buffer></buffer>

Buffer 的創(chuàng)建

Buffer.alloc 和 Buffer.allocUnsafe

創(chuàng)建固定大小的 buffer

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

  • size 新 Buffer 的所需長度
  • fill 用于預(yù)填充新 Buffer 的值。默認值: 0
  • encoding 如果 fill 是一個字符串,則這是它的字符編碼。默認值: utf8

Untitled 5.png

Buffer.allocUnsafe(size)

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

Untitled 6.png

當調(diào)用 allocUnsafe 時分配的內(nèi)存段尚未初始化,這樣分配內(nèi)存速度很塊,但分配到的內(nèi)存片段可能包含舊數(shù)據(jù)。如果在使用的時候不覆蓋這些舊數(shù)據(jù)就可能造成內(nèi)存泄露,雖然速度快,盡量避免使用

Buffer 模塊會預(yù)分配一個內(nèi)部的大小為?Buffer.poolSize 的 Buffer 實例,作為快速分配的內(nèi)存池,用于使用 allocUnsafe 創(chuàng)建新的 Buffer 實例

Buffer.from

根據(jù)內(nèi)容直接創(chuàng)建Buffer

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

Untitled 7.png

Buffer.allocUnsafe 的內(nèi)存機制

為了高效使用申請來的內(nèi)存,Node.js 采用了 slab 機制進行預(yù)先申請、事后分配,是一種動態(tài)的管理機制

使用?Buffer.alloc(size)?傳入一個指定的?size 就會申請一塊固定大小的內(nèi)存區(qū)域,slab 具有如下三種狀態(tài)

  • full: 完全分配狀態(tài)
  • partial:部分分配狀態(tài)
  • empty:沒有被分配狀態(tài)

Node.js 使用8 KB 為界限來區(qū)分是小對象還是大對象

Untitled 8.png

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

分配小對象

如果分配的對象小于 8KB,Node 會按著小對象的方式來進行分配

Buffer 的分配過程中主要使用一個局部變量?pool 作為中間處理對象,處于分配狀態(tài)的?slab 單元都指向它。以下是分配一個全新的 slab 單元的操作,它將會新申請的 SlowBuffer 對象指向它

Untitled 9.png

一個 slab 單元

Untitled 10.png

分配一個 2KB 大小的 Buffer

創(chuàng)建一個 2KB 的 buffer后,一個 slab 單元內(nèi)存如下:

Untitled 11.png

這個分配過程是由 allocate 方法完成

Untitled 12.png

當我們創(chuàng)建了一個 2KB 的 buffer 之后,當前 slab 狀態(tài)為 partial

再次創(chuàng)建 buffer 的時候,會去判斷當前 slab 剩余空間是否足夠。如果足夠,使用剩余空間,并更新 slab 的分配狀態(tài)

如果 slab 空間不夠,就會構(gòu)建新的 slab,原 slab 中剩余的空間造成浪費

分配大對象

如果有超過 8KB 的 buffer,直接會走到 creatUnsafeBuffer 函數(shù),分配一個 slab 單元,這個 slab 單元將會被這個大 Buffer 對象獨占

allocate 分配機制如圖

Untitled 13.png

Buffer 的內(nèi)存分配機制

Untitled 14.png

Buffer 和字符編碼

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

Untitled 15.png

Node 中目前支持 utf8、ucs2、utf16le、latin1、ascii、base64、hex、base64Url 八種編碼方式,具體實現(xiàn)

Untitled 16.png

針對于每一種不同的編碼方案都會用實現(xiàn)一系列 api,返回會有不同的結(jié)果,Node.js 會根據(jù)傳入的 encoding 來返回不同的對象

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

字符串轉(zhuǎn) Buffer

主要通過上述講的 Buffer.from 方法,默認的 encoding 方式為 utf-8

Buffer 轉(zhuǎn)字符串

Untitled 17.png

? 為什么會出現(xiàn)亂碼呢?如何解決這個問題呢?

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

Untitled 18.png

對于data = chunk等價于data = data.toString chunk.toString

由于一個中文占據(jù)三個字節(jié),第一個 chunk 中的第四個字節(jié)會顯示亂碼,第二個 chunk 的第一第二個字節(jié)也無法形成文字等等,所以會展示亂碼問題

更多node相關(guān)知識,請訪問:nodejs 教程!

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

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權(quán)歸原作者所有,本站不承擔相應(yīng)法律責任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

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

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

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

Go語言作為一種快速、高效的編程語言,在后端開發(fā)領(lǐng)域廣受歡迎。然而,很少有人將Go語言與前端開發(fā)聯(lián)系起來。事實上,使用Go語言進行前端開發(fā)不僅可以提高效率,還能為開發(fā)者帶來全新的視野。本文將探討使用Go語言進行前端開發(fā)的可能性,并提供具體的代碼示例,幫助讀者更好地了解這一領(lǐng)域。在傳統(tǒng)的前端開發(fā)中,通常會使用JavaScript、HTML和CSS來構(gòu)建用戶界面

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

Django是一個Python編寫的web應(yīng)用框架,它強調(diào)快速開發(fā)和干凈方法。盡管Django是一個web框架,但是要回答Django是前端還是后端這個問題,需要深入理解前后端的概念。前端是指用戶直接和交互的界面,后端是指服務(wù)器端的程序,他們通過HTTP協(xié)議進行數(shù)據(jù)的交互。在前端和后端分離的情況下,前后端程序可以獨立開發(fā),分別實現(xiàn)業(yè)務(wù)邏輯和交互效果,數(shù)據(jù)的交

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

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

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

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

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

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

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

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

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ā)揮作用,需要具體代碼示例隨著互聯(lián)網(wǎng)和移動應(yīng)用的快速發(fā)展,前端技術(shù)也愈發(fā)重要。而在這個領(lǐng)域中,Golang作為一門強大的后端編程語言,也可以發(fā)揮重要作用。本文將探討Golang如何與前端技術(shù)結(jié)合,以及通過具體的代碼示例來展示其在前端領(lǐng)域的潛力。Golang在前端領(lǐng)域的作用作為一門高效、簡潔且易于學習的

See all articles