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

Node.js中使用Buffer編碼、解碼二進位資料詳解

Feb 04, 2017 am 09:51 AM

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

熱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 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

如何創建和發布自己的JavaScript庫? 如何創建和發布自己的JavaScript庫? Mar 18, 2025 pm 03:12 PM

文章討論了創建,發布和維護JavaScript庫,專注於計劃,開發,測試,文檔和促銷策略。

如何在瀏覽器中優化JavaScript代碼以進行性能? 如何在瀏覽器中優化JavaScript代碼以進行性能? Mar 18, 2025 pm 03:14 PM

本文討論了在瀏覽器中優化JavaScript性能的策略,重點是減少執行時間並最大程度地減少對頁面負載速度的影響。

前端熱敏紙小票打印遇到亂碼問題怎麼辦? 前端熱敏紙小票打印遇到亂碼問題怎麼辦? Apr 04, 2025 pm 02:42 PM

前端熱敏紙小票打印的常見問題與解決方案在前端開發中,小票打印是一個常見的需求。然而,很多開發者在實...

如何使用瀏覽器開發人員工具有效調試JavaScript代碼? 如何使用瀏覽器開發人員工具有效調試JavaScript代碼? Mar 18, 2025 pm 03:16 PM

本文討論了使用瀏覽器開發人員工具的有效JavaScript調試,專注於設置斷點,使用控制台和分析性能。

如何有效地使用Java的收藏框架? 如何有效地使用Java的收藏框架? Mar 13, 2025 pm 12:28 PM

本文探討了Java收藏框架的有效使用。 它強調根據數據結構,性能需求和線程安全選擇適當的收集(列表,設置,地圖,隊列)。 通過高效優化收集用法

如何使用源地圖調試縮小JavaScript代碼? 如何使用源地圖調試縮小JavaScript代碼? Mar 18, 2025 pm 03:17 PM

本文說明瞭如何使用源地圖通過將其映射回原始代碼來調試JAVASCRIPT。它討論了啟用源地圖,設置斷點以及使用Chrome DevTools和WebPack之類的工具。

開始使用Chart.js:PIE,DONUT和BUBBLE圖表 開始使用Chart.js:PIE,DONUT和BUBBLE圖表 Mar 15, 2025 am 09:19 AM

本教程將介紹如何使用 Chart.js 創建餅圖、環形圖和氣泡圖。此前,我們已學習了 Chart.js 的四種圖表類型:折線圖和條形圖(教程二),以及雷達圖和極地區域圖(教程三)。 創建餅圖和環形圖 餅圖和環形圖非常適合展示某個整體被劃分為不同部分的比例。例如,可以使用餅圖展示野生動物園中雄獅、雌獅和幼獅的百分比,或不同候選人在選舉中獲得的投票百分比。 餅圖僅適用於比較單個參數或數據集。需要注意的是,餅圖無法繪製值為零的實體,因為餅圖中扇形的角度取決於數據點的數值大小。這意味著任何占比為零的實體

誰得到更多的Python或JavaScript? 誰得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript開發者的薪資沒有絕對的高低,具體取決於技能和行業需求。 1.Python在數據科學和機器學習領域可能薪資更高。 2.JavaScript在前端和全棧開發中需求大,薪資也可觀。 3.影響因素包括經驗、地理位置、公司規模和特定技能。

See all articles