P04:nodeAPI 之 Buffer

相關文章

緩衝器 Buffer

  • Buffer 類是做爲 Node.js API 的一部分引入的,用於在 TCP 流、文件系統操做、以及其餘上下文中與八位字節流進行交互
  • Buffer 是用來處理二進制數據流的
  • Buffer 實例相似於整數數組,可是其長度大小固定(建立後不可修改)
  • Buffer c++ 在V8堆外分配的物理內存
  • Buffer 是一個全局變量,直接掛載在global下

Buffer的經常使用靜態屬性和方法:

  • Buffer.alloc()
    • Buffer.alloc(10) 第一個參數爲長度,不填內容(第二個參數),即用 0 填充
    • Buffer.alloc(10, 1) 第二參數爲填充內容
    console.log(Buffer.alloc(10)) // 建立一個長度爲10的buffer
    // 輸出結果: <Buffer 00 00 00 00 00 00 00 00 00 00>
    console.log(Buffer.alloc(10,1)) // 建立一個長度爲10的buffer 而且使用1做爲默認位的填充
    // 輸出結果: <Buffer 01 01 01 01 01 01 01 01 01 01>
    複製代碼
  • Buffer.allocUnsafe()
    • 建立一個長度爲 十、且未初始化的 Buffer
    • 這個方法比調用 Buffer.alloc() 更快,
    • 但返回的 Buffer 實例可能包含舊數據,
    • 所以須要使用 fill() 或 write() 重寫。
    • 不經常使用
    console.log(Buffer.allocUnsafe(10))
    //  <Buffer 98 fe a5 8d fa 01 00 00 58 ff> 未經初始化的混亂Buffer
    複製代碼
  • Buffer.from()
    • Buffer.from([1,2,3]) 建立一個包含 [0x1, 0x2, 0x3] 的 Buffer。
    • Buffer.from('test', 'latin1') 建立一個包含 Latin-1 字節 [0x74, 0xe9, 0x73, 0x74] 的 Buffer
    console.log(Buffer.from([1,2,3]))
    // <Buffer 01 02 03>
    console.log(Buffer.from('test', 'latin1'))
    // <Buffer 74 65 73 74>
    複製代碼
  • Buffer.byteLength()
    • 返回字符串的實際字節長度。 與 String.prototype.length 不一樣,後者返回字符串的字符數
    Buffer.byteLength('test') // 4 英文字母佔位一個字節
    Buffer.byteLength('測試') // 6 中文佔位三個字節
    複製代碼
  • Buffer.isBuffer(obj)
    • obj 是一個 Buffer,則返回 true,不然返回 false。
    Buffer.isBuffer({}) false
    Buffer.isBuffer(Buffer.from([1,2,3])) true
    複製代碼
  • Buffer.concat()
    // 用含有三個 `Buffer` 實例的數組建立一個單一的 `Buffer`。
    
        const buf1 = Buffer.alloc(10);
        const buf2 = Buffer.alloc(14);
        const buf3 = Buffer.alloc(18);
        const totalLength = buf1.length + buf2.length + buf3.length;
    
        console.log(totalLength);
        // 打印: 42
        // 若是已知長度,則明確提供長度會更快
        const bufA = Buffer.concat([buf1, buf2, buf3], totalLength);
    
        console.log(bufA);
        // 打印: <Buffer 00 00 00 00 ...>
        console.log(bufA.length);
        // 打印: 42
    複製代碼
  • buf.length
    • 返回內存中分配給 buf 的字節數。 不必定反映 buf 中可用數據的字節量。
    const buf = Buffer.from('1212!')
    buf.length
    複製代碼
  • buf.toString([encoding[, start[, end]]])
    • encoding 使用的字符編碼。默認值: 'utf8'。
    • start 開始解碼的字節偏移量。默認值: 0。
    • end 結束解碼的字節偏移量(不包含)。默認值: buf.length。
    • 返回:
    • 根據 encoding 指定的字符編碼將 buf 解碼成字符串。 傳入 start 和 end 能夠只解碼 buf 的子集。
    console.log(b.toString())
    複製代碼
  • buf.fill()
    • 修改buf值
    • buf.fill(value[, offset[, end]][, encoding])
    • value | | | 用來填充 buf 的值。
    • offset 開始填充 buf 的偏移量。默認值: 0。
    • end 結束填充 buf 的偏移量(不包含)。默認值: buf.length。
    • encoding 若是 value 是字符串,則指定 value 的字符編碼。默認值: 'utf8'。
    • 返回: buf 的引用。
    const buf1 = Buffer.alloc(10)
            console.log(buf1.fill('e',2,5)) //<Buffer 00 00 65 65 65 00 00 00 00 00>
        ```
    複製代碼
  • buf.equals(otherBuffer)
    • 對比兩個buf的值是否相同
    • otherBuffer 要與 bur 對比的 Buffer 或 Uint8Array。
    • 返回:
      const buf1 = Buffer.from('ABC');
          const buf2 = Buffer.from('414243', 'hex');
          const buf3 = Buffer.from('ABCD');
      
          console.log(buf1.equals(buf2));
          // 打印: true
          console.log(buf1.equals(buf3));
          // 打印: false
      複製代碼
  • buf.indexOf() 相似於數組的 Array.indexOf()
    • 漢字佔三個字符, ==> 解決可能出現的中文亂碼問題
  • buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])
    • target | 要拷貝進的 Buffer 或 Uint8Array。
    • targetStart target 中開始寫入以前要跳過的字節數。默認值: 0。
    • sourceStart buf 中開始拷貝的偏移量。默認值: 0。
    • sourceEnd buf 中結束拷貝的偏移量(不包含)。默認值: buf.length。
    • 返回: 拷貝的字節數。
      // 建立兩個 `Buffer` 實例。
          const buf1 = Buffer.allocUnsafe(26);
          const buf2 = Buffer.allocUnsafe(26).fill('!');
      
          for (let i = 0; i < 26; i++) {
          // 97 是 'a' 的十進制 ASCII 值。
          buf1[i] = i + 97;
          }
      
          // 拷貝 `buf1` 中第 16 至 19 字節偏移量的數據到 `buf2` 第 8 字節偏移量開始。
          buf1.copy(buf2, 8, 16, 20);
      
          console.log(buf2.toString('ascii', 0, 25));
          // 打印: !!!!!!!!qrst!!!!!!!!!!!!!
      複製代碼
      // 建立一個 `Buffer`,並拷貝同一 `Buffer` 中一個區域的數據到另外一個重疊的區域。
      
          const buf = Buffer.allocUnsafe(26);
      
          for (let i = 0; i < 26; i++) {
          // 97 是 'a' 的十進制 ASCII 值。
          buf[i] = i + 97;
          }
      
          buf.copy(buf, 0, 4, 10);
      
          console.log(buf.toString());
          // 打印: efghijghijklmnopqrstuvwxyz
      複製代碼
  • string_decoder
    • string_decoder 模塊提供了一個 API,用於以保留編碼的多字節 UTF-8 和 UTF-16 字符的方式將 Buffer 對象解碼爲字符串
      // 如何去除buffer中文亂碼
          const buf = Buffer.from('中文亂碼在此!')
          // string_decoder 是buffer的內置模塊
          // 將 Buffer 實例寫入 StringDecoder 實例時,將使用內部緩衝區來確保已解碼的字符串不包含任何不完整的多字節字符。
          // 它們保存在緩衝區中,直到下一次調用 stringDecoder.write() 或調用 stringDecoder.end() 爲止
          // 簡單說就是會自動識別多字節字符,代碼操做出現不完整的狀況下不作輸出,
          //而是存儲在內存中,在下一次操做中拼接在起始位置
          const { StringDecoder } = require('string_decoder')
          const decoder = new StringDecoder('utf8')
          for(let  i = 0; i< buf.length; i+=5) {
              // 生成未初始化的Buffer
              const b = Buffer.allocUnsafe(5)
              // 拷貝
              buf.copy(b, 0, i)
              console.log(b.toString())
              // 結果
              // 中�
              // �亂�
              // ��在
              // 此�
              // ��4�║
          }
          for(let  i = 0; i< buf.length; i+=5) {
              // 生成未初始化的Buffer
              const b = Buffer.allocUnsafe(5)
              // 拷貝
              buf.copy(b, 0, i)
              console.log(decoder.write(b))
          }
      複製代碼

closenode

相關文章
相關標籤/搜索