nodejs二進(jìn)制與Buffer的介紹與使用
Buffer 介紹
javascript 中對數(shù)據(jù)處理都是以字符串的形式,而對于二進(jìn)制數(shù)據(jù)就不便于處理,所以 Buffer 便是用于讀取或操作二進(jìn)制數(shù)據(jù)都對象。
一句話概括: Buffer 類是一個全局變量,用于直接處理二進(jìn)制數(shù)據(jù),提供工具類方法。
官網(wǎng)上關(guān)于 Buffer 解釋的非常清楚,所以就不再拷貝官網(wǎng),這里列舉一些使用較為頻繁的場景。
對象轉(zhuǎn)換成Buffer
在操作文件或者IO的場景中,我們需要將對象轉(zhuǎn)換成二進(jìn)制數(shù)據(jù)流。
引用官方文檔
- Buffer.from(array) 返回一個新的 Buffer,其中包含提供的八位字節(jié)數(shù)組的副本。
- Buffer.from(arrayBuffer[, byteOffset [, length]]) 返回一個新的 Buffer,它與給定的 ArrayBuffer 共享相同的已分配內(nèi)存。
- Buffer.from(buffer) 返回一個新的 Buffer,其中包含給定 Buffer 的內(nèi)容的副本。
- Buffer.from(string[, encoding]) 返回一個新的 Buffer,其中包含提供的字符串的副本。
- Buffer.alloc(size[, fill[, encoding]]) 返回一個指定大小的新建的的已初始化的 Buffer。 此方法比 Buffer.allocUnsafe(size) 慢,但能確保新創(chuàng)建的 Buffer 實(shí)例永遠(yuǎn)不會包含可能敏感的舊數(shù)據(jù)。
- Buffer.allocUnsafe(size) 和 Buffer.allocUnsafeSlow(size) 分別返回一個指定大小的新建的未初始化的 Buffer。 由于 Buffer 是未初始化的,因此分配的內(nèi)存片段可能包含敏感的舊數(shù)據(jù)。
栗子如下
const obj = {
name:'test'
}
const buffer = Buffer.from(JSON.stringify(obj),'utf8') // 默認(rèn)編碼是 utf8
Buffer 對象轉(zhuǎn)換成其它機(jī)制的字符串
我們可以看到 Buffer 對象是一個 Uint8Array 的實(shí)例,所以我們可以使用迭代器獲取 Buffer 中數(shù)組的值。

1、Buffer 對象轉(zhuǎn)二進(jìn)制字符串,便利獲取到數(shù)組中的值,通過 Number.toString(radix) 方法,將整形轉(zhuǎn)換成二進(jìn)制字符串,最后將各個數(shù)值的二進(jìn)制字符串拼接起來即可。但為了后續(xù)對二進(jìn)制操作方便,所以我們約定好二進(jìn)制的長度,因?yàn)?Buffer 數(shù)組是在 0 到 255 之間的整數(shù)數(shù)組,255 的二進(jìn)制是 8 位,所以我們在轉(zhuǎn)換過程中把不足八位的前置補(bǔ)零,當(dāng)然這還是得看具體的場景.
bytesToBinary(bytes) {
const length = bytes.length;
let result = '';
for (let i = 0; i < length; i++) {
const binStr = Number(bytes[i]).toString(2)
result += '0'.repeat(8 - binStr.length) + binStr; // 不足八位前置補(bǔ)0
}
return result.toString();
}
2、Buffer轉(zhuǎn)成 16 進(jìn)制也是類似,如下
bytesToBinary(bytes) {
const length = bytes.length;
let result = '';
for (let i = 0; i < length; i++) {
const binStr = Number(bytes[i]).toString(16)
result += '0'.repeat(2 - binStr.length) + binStr; // 不足二位前置補(bǔ)0
}
return result.toString();
}
小結(jié)
關(guān)于 Buffer 的介紹網(wǎng)上有很多文章,但我覺得都不如官網(wǎng)寫的清晰,所以建議大家直接看文檔。
后續(xù)會繼續(xù)補(bǔ)充在工作中遇到與 Buffer 相關(guān)的使用場景,畢竟工具類函數(shù)只有在具體場景下分析才更有價值。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。
相關(guān)文章
使用socket.io實(shí)現(xiàn)簡單聊天室案例
這篇文章主要介紹了使用socket.io實(shí)現(xiàn)簡單聊天室案例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01
nvm報錯Now?using?node?v版本號(64-bit)圖文解決方法
這篇文章主要給大家介紹了關(guān)于nvm報錯Now?using?node?v版本號(64-bit)的解決方法,文中將解決的辦法介紹的非常詳細(xì),對遇到這個問題的朋友具有一定的參考借鑒價值,需要的朋友可以參考下2023-11-11
Node.js+Socket.io實(shí)現(xiàn)雙人在線五子棋對戰(zhàn)
這篇文章主要為大家詳細(xì)介紹了Node.js+Socket.io實(shí)現(xiàn)雙人在線五子棋對戰(zhàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05
Express框架實(shí)現(xiàn)簡單攔截器功能示例
這篇文章主要介紹了Express框架實(shí)現(xiàn)簡單攔截器功能,結(jié)合實(shí)例形式分析了express框架攔截器相關(guān)功能與使用方法,需要的朋友可以參考下2023-05-05
jQuery+koa2實(shí)現(xiàn)簡單的Ajax請求的示例
這篇文章主要介紹了jQuery+koa2實(shí)現(xiàn)簡單的Ajax請求的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03

