Phần 8: NodeJs – Buffer – NodeJS căn bản cho người mới bắt đầu

Javascript thuần được mã hóa Unicode 1 cách tiện dụng nhưng không thật sự tốt với những dữ liệu nhị phân. Khi làm việc với những luồng TCP hay hệ thống file, cần thiết phải xử lý những luồng dữ liệu bát phân. Node.js cung cấp các lớp Buffer cho phép lưu trữ những dữ liệu thô như 1 mảng những số nguyên ứng với phần cấp phát bộ nhớ thô bên ngoài V8 heap.
Các lớp Buffer trong Node.js là các lớp toàn cục và có thể được truy cập trong app mà không phải khai báo các Buffer Module do phương thức require() như các Module khác.
Table of Contents
Tạo các Buffer trong Node.js
Buffer trong Node.js có thể được xây dựng theo những cách khác nhau.
Cách 1
Cú pháp đối với việc tạo 1 Buffer cỡ 10:
var buf = new Buffer(10);
Cách 2
Cú pháp tạo 1 Buffer từ 1 mảng cho trước:
var buf = new Buffer([10, 20, 30, 40, 50]);
Cách 3
Cú pháp tạo 1 Buffer từ 1 chuỗi cho trước và với kiểu mã hóa thoải mái:
var buf = new Buffer("Hoc Nodejs tai Vncoder", "utf-8");
Mặc dầu “utf8” là một cách mã hóa mặc định nhưng bạn sẽ có thể sử dụng những cách mã hóa khác như “ascii”, “utf8″,”base64”, …
Ghi dữ liệu vào Buffer trong Node.js
Cú pháp
Cú pháp để ghi 1 Buffer trong Node.js là:
buf.write(string[, offset][, length][, encoding])
Chi tiết về tham số
string – Đây chính là 1 dữ liệu dạng chuỗi được ghi đến buffer.
offset – Đây chính là chỉ mục để buffer bắt đầu ghi tại đấy. Giá trị mặc định là số 0.
size – Số lượng các byte được ghi. Mặc định là buffer.size.
encoding – Mã hóa được dùng. “utf8” là mã hóa mặc định.
Giá trị trả về
Phương thức sẽ trả về mặt số lượng các byte được ghi. Nếu như RAM buffer là không đủ nhằm đáp ứng cho tất cả chuỗi, nó sẽ ghi 1 phần của chuỗi đó.
Ví dụ minh họa cách ghi dữ liệu vào Buffer trong Node.js
Ở ví dụ này, mình sử dụng phương thức write() nhận tham số là dữ liệu dạng chuỗi để ghi dữ liệu đó đến Buffer.
buf = new Buffer(256);
len = buf.write("Hoc Nodejs tai Vncoder");
console.log("Tong so byte da ghi : "+ len);
Khi chương trình trên được thực thi sẽ cho kết quả:
Tong so byte da ghi : 22
Đọc dữ liệu từ Buffer trong Node.js
Cú pháp
Cú pháp để đọc dữ liệu từ Buffer trong Node.js như dưới đây:
buf.toString([encoding][, start][, end])
Chi tiết về tham số
encoding – Là mã hóa để sử dụng. Mã hóa mặc định là ‘utf8’.
begin – Chỉ mục để bắt đầu hoạt động đọc, giá trị mặc định là 0.
finish – Chỉ mục để kết thúc hoạt động đọc, giá trị mặc định là độ dài của Buffer.
Giá trị trả về
Phương thức này giải mã và trả về 1 chuỗi từ dữ liệu được mã hóa trong Buffer do sử dụng bộ mã hóa chi tiết.
Ví dụ minh họa cách đọc dữ liệu từ Buffer trong Node.js
buf = new Buffer(26);
for (var i = 0 ; i < 26 ; i++)
{ buf[i] = i + 97; }
console.log( buf.toString('ascii'));
// Ket qua: abcdefghijklmnopqrstuvwxyz console.log( buf.toString('ascii',0,5));
// Ket qua: abcde console.log( buf.toString('utf8',0,5));
// Ket qua: abcde console.log( buf.toString(undefined,0,5));
// Su dung ma hoa mac dinh 'utf8', Ket qua la: abcde
Khi chương trình trên được thực thi sẽ cho kết quả:
abcdefghijklmnopqrstuvwxyz abcde abcde abcde
Chuyển đổi Buffer thành JSON trong Node.js
Cú pháp
Để chuyển 1 Buffer trong Node.js thành đối tượng JSON, bạn sử dụng phương thức toJSON() có cú pháp nhu sau:
buf.toJSON()
Giá trị trả về
Phương thức này trả về 1 biểu diễn JSON cho đối tượng Buffer đã cho.
Ví dụ minh họa cách chuyển đổi Buffer thành JSON
var buf = new Buffer('Simply Easy Learning');
var json = buf.toJSON(buf); console.log(json);
Khi chương trình trên được thực thi sẽ cho kết quả:
[ 83, 105, 109, 112, 108, 121, 32, 69, 97, 115, 121, 32, 76, 101, 97, 114, 110, 105, 110, 103 ]
Ghép nối các Buffer trong Node.js
Cú pháp
Để nối ghép 2 hay nhiều Buffer thành 1 Buffer trong Node.js, bạn sử dụng phương thức concat() như dưới đây:
Buffer.concat(record[, totalLength])
Chi tiết về tham số
record – Xác định 1 mảng các Buffer được dùng để ghép nối thành 1 Buffer.
totalLength – Là tổng độ dài của các Buffer sau khi được ghép nối.
Giá trị trả về
Phương thức này trả về 1 Buffer mới.
Ví dụ minh họa cách ghép nối các Buffer
var buffer1 = new Buffer('Học vui cùng ');
var buffer2 = new Buffer('Vncoder');
var buffer3 = Buffer.concat([buffer1,buffer2]);
console.log("Noi dung cua buffer3 la: " + buffer3.toString());
Khi chương trình trên được thực thi sẽ cho kết quả:
Noi dung cua buffer3 la: Học vui cùng Vncoder
So sánh các Buffer trong Node.js
Cú pháp
Để so sánh 2 Buffer trong Node.js, bạn sử dụng phương thức examine() như dưới đây:
buf.examine(differentBuffer);
Chi tiết về tham số
differentBuffer – 1 Buffer khác để được so sánh với Buffer có tên là buf.
Giá trị trả về
Trả về 1 giá trị dạng số thể hiện Buffer này là đứng trước, sau hay cùng thứ tự với Buffer kia.
Ví dụ minh họa cách so sánh 2 Buffer trong Node.js
var buffer1 = new Buffer('ABC');
var buffer2 = new Buffer('ABCD');
var consequence = buffer1.examine(buffer2);
if(consequence < 0)
{ console.log(buffer1 +" dung truoc " + buffer2); }
else if(consequence == 0)
{ console.log(buffer1 +" cung thu tu voi " + buffer2); }
else { console.log(buffer1 +" dung sau " + buffer2); }
Khi chương trình trên được thực thi sẽ cho kết quả:
ABC dung truoc ABCD
Sao chép Buffer trong Node.js
Cú pháp
Để copy Buffer trong Node.js, bạn sử dụng phương thức copy() như dưới đây:
buf.copy(goalBuffer[, targetStart][, sourceStart][, sourceEnd])
Chi tiết về tham số
goalBuffer – Đối tượng Buffer, đây chính là nơi Buffer sẽ được copy.
targetStart – Dạng số, mặc định là 0.
sourceStart – Dạng số, mặc định là 0.
sourceEnd – Dạng số, mặc định là độ dài của buffer.
Giá trị trả về
Phương thức copy() này không trả về bất kỳ giá trị nào.
Ví dụ minh họa cách copy Buffer
var buffer1 = new Buffer('ABC');
// Sao chep mot buffer
var buffer2 = new Buffer(3);
buffer1.copy(buffer2);
console.log("Noi dung cua buffer2 la: " + buffer2.toString());
Khi chương trình trên được thực thi sẽ cho kết quả:
Noi dung cua buffer2 la: ABC
Chia nhỏ Buffer trong Node.js
Cú pháp
Để lập 1 Buffer con của 1 Buffer trong Node.js, bạn sử dụng phương thức slice() như dưới đây:
buf.slice([start][, end])
Chi tiết về tham số
begin – Dạng số, giá trị mặc định là 0.
finish – Dạng số, giá trị mặc định là buffer.size
Giá trị trả về
Trả về 1 Buffer mới mà tham chiếu đến cùng vùng bộ nhớ như Buffer cũ.
Ví dụ
var buffer1 = new Buffer('VietNamVoDoi');
//Chia nho mot buffer
var buffer2 = buffer1.slice(0,7);
console.log("Noi dung cua buffer2 la: " + buffer2.toString());
Khi chương trình trên được thực thi sẽ cho kết quả:
Noi dung cua buffer2 la: VietNam
Độ dài Buffer trong Node.js
Cú pháp
Để lấy độ dài (bằng giá trị byte) của 1 Buffer trong Node.js, bạn sử dụng thuộc tính size như dưới đây:
buf.size;
Giá trị trả về
Trả về mức độ dài bằng byte của 1 Buffer.
Ví dụ
var buffer = new Buffer('VietNamVoDoi');
//Do dai cua buffer console.log("Do dai cua buffer la: " + buffer.size);
Khi chương trình trên được thực thi sẽ cho kết quả:
Do dai cua buffer