nodejs 二進制與Buffer

Buffer 介紹

javascript 中對數據處理都是以字符串的形式,而對於二進制數據就不便於處理,因此 Buffer 即是用於讀取或操做二進制數據都對象。javascript

一句話歸納: Buffer 類是一個全局變量,用於直接處理二進制數據,提供工具類方法。java

官網上關於 Buffer 解釋的很是清楚,因此就再也不拷貝官網,這裏列舉一些使用較爲頻繁的場景。數組

對象轉換成Buffer

在操做文件或者IO的場景中,咱們須要將對象轉換成二進制數據流。函數

引用官方文檔工具

  • Buffer.from(array) 返回一個新的 Buffer,其中包含提供的八位字節數組的副本。ui

  • Buffer.from(arrayBuffer[, byteOffset [, length]]) 返回一個新的 Buffer,它與給定的 ArrayBuffer 共享相同的已分配內存。編碼

  • Buffer.from(buffer) 返回一個新的 Buffer,其中包含給定 Buffer 的內容的副本。spa

  • Buffer.from(string[, encoding]) 返回一個新的 Buffer,其中包含提供的字符串的副本。3d

  • Buffer.alloc(size[, fill[, encoding]]) 返回一個指定大小的新建的的已初始化的 Buffer。 此方法比 Buffer.allocUnsafe(size) 慢,但能確保新建立的 Buffer 實例永遠不會包含可能敏感的舊數據。code

  • Buffer.allocUnsafe(size) 和 Buffer.allocUnsafeSlow(size) 分別返回一個指定大小的新建的未初始化的 Buffer。 因爲 Buffer 是未初始化的,所以分配的內存片斷可能包含敏感的舊數據。

栗子以下

const obj = {
    name:'test'
}
const buffer = Buffer.from(JSON.stringify(obj),'utf8') // 默認編碼是 utf8 
複製代碼

Buffer 對象轉換成其它機制的字符串

咱們能夠看到 Buffer 對象是一個 Uint8Array 的實例,因此咱們可使用迭代器獲取 Buffer 中數組的值。

buffer

  1. Buffer 對象轉二進制字符串,便利獲取到數組中的值,經過 Number.toString(radix) 方法,將整形轉換成二進制字符串,最後將各個數值的二進制字符串拼接起來便可。但爲了後續對二進制操做方便,因此咱們約定好二進制的長度,由於 Buffer 數組是在 0 到 255 之間的整數數組,255 的二進制是 8 位,因此咱們在轉換過程當中把不足八位的前置補零,固然這仍是得看具體的場景.
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; // 不足八位前置補0
    }
    return result.toString();
}
複製代碼
  1. Buffer轉成 16 進制也是相似,以下
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; // 不足二位前置補0
    }
    return result.toString();
}
複製代碼

小結

關於 Buffer 的介紹網上有不少文章,但我以爲都不如官網寫的清晰,因此建議你們直接看文檔。

後續會繼續補充在工做中遇到與 Buffer 相關的使用場景,畢竟工具類函數只有在具體場景下分析才更有價值。

相關文章
相關標籤/搜索