openplanning

Hướng dẫn và ví dụ NodeJS Buffer

  1. NodeJS Buffer
  2. TODO (Chem gio tiep)

1. NodeJS Buffer

Khi làm việc trên một môi trường Internet, nơi mà các dữ liệu được truyền tải thông qua TCP, ứng dụng của bạn thường xuyên phải làm việc với các luồng nhị phân (Binary Stream). NodeJS cung cấp cho bạn lớp Buffer (Bộ đệm), nó giúp bạn có thể làm việc với từng byte của dữ liệu.
Buffer là một lớp thuộc module buffer, tuy nhiên vì tính quan trọng và thông dụng, bạn không cần phải nhập khẩu nó, mà vẫn có thể sử dụng lớp này ở bất kỳ nơi nào trong project của bạn.
Lớp Buffer có một vài constructor, nhưng tất cả các contructor này đã bị lỗi thời (Không được chấp nhận) (Deprecated).
Constructor
Buffer(size)
Buffer(byteArray)
Buffer(buffer)
Buffer(byteArray[, byteOffset[, length]])
Buffer(string[, encoding])
Thay vào đó bạn có thể tạo ra các đối tượng Buffer thông qua các phương thức tĩnh (Phương thức lớp)
Class Method
Buffer.alloc(size[, fill[, encoding]])
Buffer.allocUnsafe(size)
Buffer.allocUnsafeSlow(size)
Buffer.byteLength(string[, encoding])
Buffer.concat(list[, totalLength])
Buffer.from(array)
Buffer.from(arrayBuffer[, byteOffset[, length]])
Buffer.from(buffer)
Buffer.from(string[, encoding])
Buffer.from(object[, offsetOrEncoding[, length]])
Buffer.alloc(size[, fill[, encoding]]) --> Buffer
Phương thức trả về một đối tượng Buffer.
  • size <integer> Độ dài mong muốn của Buffer.
  • fill <string> | <Buffer> | <integer> Giá trị khởi tạo cho Buffer.
  • encoding <string> Mã hóa (encoding) cho Buffer này, mặc định: 'utf8'.
buffer-alloc-example.js
// Create a Buffer with length of array is 5
const buf1 = Buffer.alloc(5);

// ===> <Buffer 00 00 00 00 00>
console.log(buf1);

// @fill: A string
const buf2 = Buffer.alloc(5, 'abc');

// ==> ['a', 'b', 'c', 'a', 'b']
// ===> <Buffer 61 62 63 61 62>
console.log(buf2);

// ==> abcab
console.log(buf2.toString());

// Encoding: base64
const buf3 = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64');

// ==> <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64>
console.log(buf3);

// ==> hello world
console.log(buf3.toString());
Buffer.allocUnsafe(size) ==> Buffer
  • size <integer> Độ dài mong muốn của Buffer.
Buffer.allocUnsafe(size) là phương thức để tạo ra một đối tượng Buffer với kích thước mảng được chỉ định 'size'. Các phần tử của mảng này có giá trị tùy thuộc vào địa chỉ của nó trên bộ nhớ. Phương thức Buffer.alloc(size) cũng tạo ra một đối tượng Buffer, nhưng tất cả các phần tử của mảng có giá trị 0.
buffer-allocUnsafe-example.js
// Create a Buffer
var buf = Buffer.allocUnsafe(15);

// Result Like:
// <Buffer 08 00 00 00 07 00 00 00 0e 00 00 00 06 00 00>
console.log(buf); 
buf.fill('abcd'); 

// <Buffer 61 62 63 64 61 62 63 64 61 62 63 64 61 62 63>
console.log(buf);

// ==> abcdabcdabcdabc
console.log(buf.toString());

buf.fill(0);

// <Buffer 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00>
console.log(buf);
Buffer.allocUnsafeSlow(size) ==> Buffer
Các đối tượng được tạo ra trên bộ nhớ, và sau khi nó không còn được sử dụng nữa nó sẽ bị loại bỏ bởi "Garbage Collector" (Một chương trinh gom rác). Và các đối tượng Buffer cũng vậy, chúng được tạo ra quá trình ứng dụng của bạn hoạt động.
Để chương trình chạy nhanh hơn, và hạn chế phải sử dụng "Garbage Collector", NodeJS sử dụng một bể chứa (Pool) để chứa các đối tượng Buffer không còn được sử dụng. Khi ứng dụng cần tới một đối tượng Buffer, nó sẽ lấy ra một đối tượng này ra từ trong bể chứa (Pool).
Phương thức Buffer.allocUnsafe() trả về một Buffer từ trong Pool, nó chỉ tạo mới một Buffer khi trong Pool không còn Buffer nào để lấy ra. Trong trường hợp bạn muốn có một Buffer để sử dụng lâu dài, và không được quản lý trong Pool thì hãy sử dụng phương thức Buffer.allocUnsafeSlow(size). Chẳng hạn bạn dùng phương thức này để tạo ra một Buffer mẫu (dữ liệu mẫu), dùng để copy cho các Buffer khác.
Buffer.from(arrayBuffer[, byteOffset[, length]])
  • arrayBuffer <ArrayBuffer> | <SharedArrayBuffer>
  • byteOffset <integer> Giá trị mặc định của tham số này là 0.
  • length <integer> Giá trị mặc định của tham số này là: arrayBuffer.length - byteOffset.
buffer-from-example.js
const arr = new Uint16Array(2);

arr[0] = 5000;
arr[1] = 4000;

// Shares memory with `arr`
const buf = Buffer.from(arr.buffer);

// ==> <Buffer 88 13 a0 0f>
console.log(buf);

// Changing the original Uint16Array changes the Buffer also
arr[1] = 6000;

// ==> <Buffer 88 13 70 17>
console.log(buf);

2. TODO (Chem gio tiep)