搜尋
首頁web前端js教程Node.js中使用Buffer編碼、解碼二進位資料詳解

JavaScript很擅長處理字串,但是因為它最初的設計是用來處理HTML文檔,因此它並不太擅長處理二進位資料。 JavaScript沒有byte類型,沒有結構化的型別(structured types),甚至沒有位元組數組,只有數字和字串。 (原文:JavaScript doesn't have a byte type — it just has numbers — or structured types, or http://skylitecellars.com/ even byte arrays: It just has strings.)

因為Node基於JavaScript,它自然可以基於JavaScript,它自然可以基於JavaScript,它因為Node處理類似HTTP這樣的文字協議,但是你也可以用它來跟資料庫交互,處理圖片或檔案上傳等,可以想像,如果僅僅用字串來做這些事得有多困難。早些時候,Node透過將byte編碼成文字字元來處理二進位數據,但這種方式後來被證明並不可行,既浪費資源,又緩慢,又不靈活,而且難以維護。

Node有一個二進位緩衝實作Buffer,這個偽類別(pseudo-class)提供了一系列處理二進位資料的API,簡化了那些需要處理二進位資料的任務。緩衝的長度由位元組資料的長度決定,而且你可以隨機的設定和取得緩衝內的位元組資料。

注意:Buffer類別有一個特殊的地方,緩衝內的位元組資料所佔用的記憶體不是分配在JavaScrp

It VM記憶體堆上的,也就是說這些物件不會被JavaScript的垃圾回收演算法處理,取而代之的是一個不會被修改的永久記憶體位址,這也避免了緩衝內容的記憶體複製所造成的CPU浪費。

建立緩衝

你可以用一個UTF-8字串建立緩衝,像這樣:

var buf = new Buffer(‘Hello World!');

也可以用指定編碼的字串建立緩衝:

var buf = new Buffer('8b76fde713ce', 'base64');

可接受的字元編碼和識別如下:

1 .ascii——ASCI,僅適用於ASCII字元集。
2.utf8——UTF-8,這種可變寬編碼適用於Unicode字符集的任何字符,它已經成了Web世界的首選編碼,也是Node的預設編碼類型。
3.base64——Base64,這種編碼基於64個可列印ASCII字元來表示二進位數據,Base64通常用於在字元文件內嵌入可以被轉化成字串的二進位數據,在需要時又可以完整無損的轉換回原來的二進位格式。

如果沒有資料來初始化緩衝,可以用指定的容量大小來創建一個空緩衝:

var buf = new Buffer(1024); // 创建一个1024字节的缓冲

獲取和設定緩衝資料

創建或接收一個緩衝物件後,您可能要查看或修改它的內容,可以透過[]操作符來存取緩衝的某個位元組:

var buf = new Buffer('my buffer content');
// 访问缓冲内第10个字节
console.log(buf[10]); // -> 99

注意:當你(使用緩衝容量大小來)建立一個已初始化的緩衝時,一定要注意,緩衝的資料並沒有被初始化成0,而是隨機數據。

var buf = new Buffer(1024);
console.log(buf[100]); // -> 5 (某个随机值)

你可以這樣修改緩衝裡任何位置的資料:

buf[99] = 125; // 把第100个字节的值设置为125

注意:在某些情況下,一些緩衝操作並不會產生錯誤,例如:

1.緩衝內的位元組最大值為255,如果某個位元組被賦予大於256的數字,將會用256對其取模,然後將結果賦給這個位元組。
2.如果將緩衝的某個位元組賦值為256,它的實際值將會是0(譯者註:其實跟第一條重複,256%256=0)
3.如果用浮點數給緩衝內某個位元組賦值,例如100.7,實際值將會是浮點數的整數部分-100
4.如果你嘗試給一個超出緩衝容量的位置賦值,賦值操作將會失敗,緩衝不做任何修改。

你可以用length屬性取得緩衝的長度:

var buf = new Buffer(100);
console.log(buf.length); // -> 100

還可以使用緩衝長度迭代緩衝的內容,來讀取或設定每個位元組:

var buf = new Buffer(100);
for(var i = 0; i < buf.length; i++) {
    buf[i] = i;
}

上面程式碼新建了一個包含100個位元組的緩衝,並從0到99設定了緩衝內每個位元組。

切分緩衝資料

一旦創建或接收了一個緩衝,你可能需要提取緩衝資料的一部分,可以透過指定起始位置來切分現有的緩衝,從而創建另外一個較小的緩衝:

var buffer = new Buffer("this is the content of my buffer");

var smallerBuffer = buffer.slice(8, 19);
console.log(smallerBuffer.toString()); // -> "the content"

注意,當切分一個緩衝的時候並沒有新的內存被分配或複製,新的緩衝使用父緩衝的內存,它只是父緩衝某段數據(由起始位置指定)的引用。這段話含有幾個意思。

首先,如果你的程式修改了父緩衝的內容,這些修改也會影響相關的子緩衝,因為父緩衝和子緩衝是不同的JavaScript對象,因此很容易忽略這個問題,並導致一些潛在的bug。

其次,當你用這種方式從父緩衝創建一個較小的子緩衝時,父緩衝對像在操作結束後依然會被保留,並不會被垃圾回收,如果不注意的話,很容易會造成內存外洩。

注意:如果你擔心因此產生記憶體外洩問題,你可以使用copy方法來取代slice操作,以下將會介紹copy。

複製緩衝資料

你可以像這樣用copy將緩衝的一部分複製到另外一個緩衝:

var buffer1 = new Buffer("this is the content of my buffer");
var buffer2 = new Buffer(11);
var targetStart = 0;
var sourceStart = 8;
var sourceEnd = 19;
buffer1.copy(buffer2, targetStart, sourceStart, sourceEnd);
console.log(buffer2.toString()); // -> "the content"

上面程式碼,複製來源緩衝的第9到20個位元組到目標緩衝的開始位置。

解碼緩衝資料

緩衝資料可以這樣轉換成一個UTF-8字串:

var str = buf.toString();

还可以通过指定编码类型来将缓冲数据解码成任何编码类型的数据。比如,你想把一个缓冲解码成base64字符串,可以这么做:

var b64Str = buf.toString("base64");

使用toString函数,你还可以把一个UTF-8字符串转码成base64字符串:

var utf8String = &#39;my string&#39;;
var buf = new Buffer(utf8String);
var base64String = buf.toString(&#39;base64&#39;)

小结

有时候,你不得不跟二进制数据打交道,但是原生JavaScript又没有明确的方式来做这件事,于是Node提供了Buffer类,封装了一些针对连续内存块的操作。你可以在两个缓冲之间切分或复制内存数据。

你也可以把一个缓冲转换成某种编码的字符串,或者反过来,把一个字符串转化成缓冲,来访问或处理每个bit。

更多Node.js中使用Buffer编码、解码二进制数据详解相关文章请关注PHP中文网!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
JavaScript引擎:比較實施JavaScript引擎:比較實施Apr 13, 2025 am 12:05 AM

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

超越瀏覽器:現實世界中的JavaScript超越瀏覽器:現實世界中的JavaScriptApr 12, 2025 am 12:06 AM

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

使用Next.js(後端集成)構建多租戶SaaS應用程序使用Next.js(後端集成)構建多租戶SaaS應用程序Apr 11, 2025 am 08:23 AM

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

如何使用Next.js(前端集成)構建多租戶SaaS應用程序如何使用Next.js(前端集成)構建多租戶SaaS應用程序Apr 11, 2025 am 08:22 AM

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript:探索網絡語言的多功能性JavaScript:探索網絡語言的多功能性Apr 11, 2025 am 12:01 AM

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的演變:當前的趨勢和未來前景JavaScript的演變:當前的趨勢和未來前景Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

神秘的JavaScript:它的作用以及為什麼重要神秘的JavaScript:它的作用以及為什麼重要Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python還是JavaScript更好?Python還是JavaScript更好?Apr 06, 2025 am 12:14 AM

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。1.Python以简洁语法和丰富库生态著称,适用于数据分析和Web开发。2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器