Xóa bộ đệm nodejs

Tôi là nhà phát triển JavaScript full-stack trên ngăn xếp MEVN. Tôi thích chia sẻ kiến ​​thức về quá trình chuyển đổi từ kỹ thuật hàng hải sang phát triển phần mềm để khuyến khích những người yêu thích phát triển phần mềm và không biết bắt đầu từ đâu. Tôi cũng đóng góp cho PMNM trong thời gian rảnh rỗi

trong nút. js, bộ đệm là một loại đối tượng đặc biệt có thể lưu trữ dữ liệu nhị phân thô. Bộ đệm đại diện cho một đoạn bộ nhớ - thường là RAM - được phân bổ trong máy tính của bạn. Sau khi được đặt, kích thước của bộ đệm không thể thay đổi

Bộ đệm lưu trữ byte. Một byte là một chuỗi tám bit. Bit là đơn vị lưu trữ cơ bản nhất trên máy tính của bạn, chúng có thể giữ giá trị 0 hoặc 1

Nút. js hiển thị lớp

// Creates a new buffer with the string 'heya!'
// If no enconding is passed in the second parameter, defaults to 'utf-8'.
Buffer.from("heya!");

// Creates the same buffer as the above, but passes 'heya!' as a hex encoded string
Buffer.from("6865796121", "hex");
4 trong phạm vi toàn cầu (bạn không cần nhập hoặc yêu cầu nó như các mô-đun khác). Với API này, bạn có một loạt các chức năng và phần tóm tắt để thao tác các tệp nhị phân thô

Một bộ đệm trong Node. js trông như thế này

<Buffer 61 2e 71 3b 65 2e 31 2f 61 2e>

Trong ví dụ này, bạn có thể thấy 10 cặp chữ cái và số. Mỗi cặp đại diện cho một byte được lưu trữ trong bộ đệm. Tổng kích thước của bộ đệm cụ thể này là 10

Bạn có thể tự hỏi mình. "nếu đây là bit và byte, thì số 0 và 1 ở đâu?"

Đó là bởi vì Nút. js hiển thị byte bằng hệ thập lục phân. Bằng cách này, mỗi byte có thể được biểu diễn chỉ bằng hai chữ số - một cặp số và chữ cái từ 0-9 và “a” đến “f”

Tại sao bộ đệm? . Bạn sẽ phải dùng đến các nguyên hàm như chuỗi, chậm hơn và không có công cụ chuyên dụng để xử lý các tệp nhị phân. Bộ đệm được tạo để cung cấp một bộ API thích hợp để thao tác các bit và byte một cách dễ dàng và hiệu quả

Làm việc với bộ đệm

Hãy xem một số điều chúng ta có thể làm với bộ đệm

Bạn sẽ nhận thấy rằng việc xử lý bộ đệm hơi giống với cách chúng ta xử lý mảng trong JavaScript. Ví dụ: bạn có thể

// Creates a new buffer with the string 'heya!'
// If no enconding is passed in the second parameter, defaults to 'utf-8'.
Buffer.from("heya!");

// Creates the same buffer as the above, but passes 'heya!' as a hex encoded string
Buffer.from("6865796121", "hex");
5,
// Creates a new buffer with the string 'heya!'
// If no enconding is passed in the second parameter, defaults to 'utf-8'.
Buffer.from("heya!");

// Creates the same buffer as the above, but passes 'heya!' as a hex encoded string
Buffer.from("6865796121", "hex");
6 và nhận
// Creates a new buffer with the string 'heya!'
// If no enconding is passed in the second parameter, defaults to 'utf-8'.
Buffer.from("heya!");

// Creates the same buffer as the above, but passes 'heya!' as a hex encoded string
Buffer.from("6865796121", "hex");
7 của bộ đệm. Bộ đệm cũng có thể lặp lại và có thể được sử dụng trong các cấu trúc như
// Creates a new buffer with the string 'heya!'
// If no enconding is passed in the second parameter, defaults to 'utf-8'.
Buffer.from("heya!");

// Creates the same buffer as the above, but passes 'heya!' as a hex encoded string
Buffer.from("6865796121", "hex");
8

Nếu bạn đang làm theo các ví dụ trên máy tính của mình, hãy nhớ rằng lớp

// Creates a new buffer with the string 'heya!'
// If no enconding is passed in the second parameter, defaults to 'utf-8'.
Buffer.from("heya!");

// Creates the same buffer as the above, but passes 'heya!' as a hex encoded string
Buffer.from("6865796121", "hex");
4 được hiển thị trên toàn cầu. Bạn không cần nhập hoặc yêu cầu nó dưới dạng một mô-đun riêng biệt

Tạo bộ đệm

Bộ đệm được tạo bằng ba phương pháp này

  • Đệm. từ()
  • Đệm. phân bổ()
  • Đệm. cấp phátUnsafe()

Trước đây, bộ đệm được tạo bằng cách sử dụng hàm tạo của lớp Bộ đệm (e. g. ,

// Also writes 'heya!' to the buffer, but passes a array of bytes
Buffer.from([0x68, 0x65, 0x79, 0x61, 0x21]);
0). Cú pháp này hiện không được dùng nữa

Đệm. từ()

Phương pháp này là cách đơn giản nhất để tạo bộ đệm. Nó chấp nhận một chuỗi, một mảng, một

// Also writes 'heya!' to the buffer, but passes a array of bytes
Buffer.from([0x68, 0x65, 0x79, 0x61, 0x21]);
1 hoặc một thể hiện bộ đệm khác. Tùy thuộc vào thông số bạn vượt qua,
// Also writes 'heya!' to the buffer, but passes a array of bytes
Buffer.from([0x68, 0x65, 0x79, 0x61, 0x21]);
2 sẽ tạo bộ đệm theo một cách hơi khác

Khi truyền một chuỗi, một đối tượng vùng đệm mới sẽ được tạo chứa chuỗi đó. Theo mặc định, nó sẽ phân tích cú pháp đầu vào của bạn bằng cách sử dụng utf-8 làm mã hóa (xem tại đây tất cả các loại mã hóa được hỗ trợ)

// Creates a new buffer with the string 'heya!'
// If no enconding is passed in the second parameter, defaults to 'utf-8'.
Buffer.from("heya!");

// Creates the same buffer as the above, but passes 'heya!' as a hex encoded string
Buffer.from("6865796121", "hex");

Bạn cũng có thể chuyển một mảng byte tới

// Also writes 'heya!' to the buffer, but passes a array of bytes
Buffer.from([0x68, 0x65, 0x79, 0x61, 0x21]);
2. Ở đây tôi đang truyền cùng một chuỗi như trước (“heya. ”), nhưng được biểu diễn dưới dạng một mảng các ký tự thập lục phân

// Also writes 'heya!' to the buffer, but passes a array of bytes
Buffer.from([0x68, 0x65, 0x79, 0x61, 0x21]);

Nếu bạn không quen với cú pháp

// Also writes 'heya!' to the buffer, but passes a array of bytes
Buffer.from([0x68, 0x65, 0x79, 0x61, 0x21]);
4, điều đó có nghĩa là các ký tự sau
// Also writes 'heya!' to the buffer, but passes a array of bytes
Buffer.from([0x68, 0x65, 0x79, 0x61, 0x21]);
5 sẽ được hiểu là giá trị thập lục phân

Khi chuyển bộ đệm tới

// Also writes 'heya!' to the buffer, but passes a array of bytes
Buffer.from([0x68, 0x65, 0x79, 0x61, 0x21]);
2, Nút. js sẽ sao chép bộ đệm đó vào bộ đệm hiện tại. Bộ đệm mới được phân bổ trong một vùng bộ nhớ khác, vì vậy bạn có thể sửa đổi nó một cách độc lập

<Buffer 61 2e 71 3b 65 2e 31 2f 61 2e>
6

Chúng sẽ bao gồm hầu hết các trường hợp bạn sử dụng

// Also writes 'heya!' to the buffer, but passes a array of bytes
Buffer.from([0x68, 0x65, 0x79, 0x61, 0x21]);
2. Tham khảo tài liệu để biết các cách khác để sử dụng nó

Đệm. phân bổ()

Phương thức

// Also writes 'heya!' to the buffer, but passes a array of bytes
Buffer.from([0x68, 0x65, 0x79, 0x61, 0x21]);
8 rất hữu ích khi bạn muốn tạo bộ đệm trống mà không nhất thiết phải điền dữ liệu vào. Theo mặc định, nó chấp nhận một số và trả về bộ đệm có kích thước đã cho chứa đầy số 0

<Buffer 61 2e 71 3b 65 2e 31 2f 61 2e>
9

Sau này, bạn có thể điền vào bộ đệm bất kỳ dữ liệu nào bạn muốn

// Creates a new buffer with the string 'heya!'
// If no enconding is passed in the second parameter, defaults to 'utf-8'.
Buffer.from("heya!");

// Creates the same buffer as the above, but passes 'heya!' as a hex encoded string
Buffer.from("6865796121", "hex");
0

Bạn cũng có thể điền vào bộ đệm bằng nội dung khác 0 và mã hóa đã cho

// Creates a new buffer with the string 'heya!'
// If no enconding is passed in the second parameter, defaults to 'utf-8'.
Buffer.from("heya!");

// Creates the same buffer as the above, but passes 'heya!' as a hex encoded string
Buffer.from("6865796121", "hex");
1

Đệm. cấp phátUnsafe()

Với

// Also writes 'heya!' to the buffer, but passes a array of bytes
Buffer.from([0x68, 0x65, 0x79, 0x61, 0x21]);
9 , quá trình khử trùng và lấp đầy bộ đệm bằng 0 bị bỏ qua. Bộ đệm sẽ được phân bổ trong một vùng bộ nhớ có thể chứa dữ liệu cũ (đó là nơi xuất phát của phần “không an toàn”). Ví dụ: đoạn mã sau rất có thể sẽ luôn in một số mẩu dữ liệu ngẫu nhiên mỗi khi bạn chạy nó

// Creates a new buffer with the string 'heya!'
// If no enconding is passed in the second parameter, defaults to 'utf-8'.
Buffer.from("heya!");

// Creates the same buffer as the above, but passes 'heya!' as a hex encoded string
Buffer.from("6865796121", "hex");
3

Một trường hợp sử dụng tốt cho

// Also writes 'heya!' to the buffer, but passes a array of bytes
Buffer.from([0x68, 0x65, 0x79, 0x61, 0x21]);
9 là khi bạn đang sao chép một bộ đệm đã được cấp phát an toàn. Vì bạn sẽ ghi đè hoàn toàn bộ đệm đã sao chép nên tất cả các byte cũ sẽ được thay thế bằng dữ liệu có thể dự đoán được

// Creates a new buffer with the string 'heya!'
// If no enconding is passed in the second parameter, defaults to 'utf-8'.
Buffer.from("heya!");

// Creates the same buffer as the above, but passes 'heya!' as a hex encoded string
Buffer.from("6865796121", "hex");
5

Nói chung, chỉ nên sử dụng

// Also writes 'heya!' to the buffer, but passes a array of bytes
Buffer.from([0x68, 0x65, 0x79, 0x61, 0x21]);
9 nếu bạn có lý do chính đáng (e. g. , tối ưu hóa hiệu suất). Bất cứ khi nào sử dụng nó, hãy đảm bảo rằng bạn không bao giờ trả lại bộ đệm được phân bổ mà không điền đầy đủ dữ liệu mới vào bộ đệm, nếu không, bạn có khả năng bị rò rỉ thông tin nhạy cảm

Ghi vào bộ đệm

Cách ghi dữ liệu vào bộ đệm đang sử dụng

<Buffer 61 2e 71 3b 65 2e 31 2f 61 2e>
62. Theo mặc định, nó sẽ ghi một chuỗi được mã hóa bằng
<Buffer 61 2e 71 3b 65 2e 31 2f 61 2e>
63 mà không có phần bù (bắt đầu ghi từ vị trí đầu tiên của bộ đệm). Nó trả về một số, là số byte đã được ghi trong bộ đệm

// Creates a new buffer with the string 'heya!'
// If no enconding is passed in the second parameter, defaults to 'utf-8'.
Buffer.from("heya!");

// Creates the same buffer as the above, but passes 'heya!' as a hex encoded string
Buffer.from("6865796121", "hex");
9

Hãy nhớ rằng không phải tất cả các ký tự đều chiếm một byte trong bộ đệm (. )

// Creates a new buffer with the string 'heya!'
// If no enconding is passed in the second parameter, defaults to 'utf-8'.
Buffer.from("heya!");

// Creates the same buffer as the above, but passes 'heya!' as a hex encoded string
Buffer.from("6865796121", "hex");
0

Cũng lưu ý rằng 2 không phải là số byte cao nhất mà một ký tự có thể có. Ví dụ: loại mã hóa ________ 163 hỗ trợ các ký tự có tối đa 4 byte. Vì bạn không thể sửa đổi kích thước của bộ đệm, nên bạn luôn cần lưu tâm đến những gì bạn đang viết và dung lượng mà nó sẽ chiếm (kích thước của bộ đệm so với. kích thước nội dung của bạn)

Một cách khác để ghi vào bộ đệm là thông qua cú pháp giống như mảng, trong đó bạn thêm byte vào một vị trí cụ thể của bộ đệm. Điều quan trọng cần lưu ý là bất kỳ dữ liệu nào có nhiều hơn 1 byte cần được chia nhỏ và đặt trên từng vị trí của bộ đệm

// Creates a new buffer with the string 'heya!'
// If no enconding is passed in the second parameter, defaults to 'utf-8'.
Buffer.from("heya!");

// Creates the same buffer as the above, but passes 'heya!' as a hex encoded string
Buffer.from("6865796121", "hex");
1

Mặc dù chúng tôi đánh giá cao việc bạn có thể ghi vào bộ đệm bằng cú pháp giống như mảng, nhưng tôi khuyên bạn nên sử dụng

// Also writes 'heya!' to the buffer, but passes a array of bytes
Buffer.from([0x68, 0x65, 0x79, 0x61, 0x21]);
2 khi bạn có thể. Quản lý độ dài của đầu vào có thể là một nhiệm vụ khó khăn và sẽ mang lại sự phức tạp cho mã của bạn. Với
<Buffer 61 2e 71 3b 65 2e 31 2f 61 2e>
66, bạn có thể viết mọi thứ vào bộ đệm mà không phải lo lắng và xử lý các trường hợp đầu vào quá lớn bằng cách kiểm tra xem có gì được ghi không (khi nó trả về 0)

Lặp lại bộ đệm

Bạn có thể sử dụng các cấu trúc JavaScript hiện đại để lặp qua bộ đệm giống như cách bạn làm với một mảng. Ví dụ, với

// Creates a new buffer with the string 'heya!'
// If no enconding is passed in the second parameter, defaults to 'utf-8'.
Buffer.from("heya!");

// Creates the same buffer as the above, but passes 'heya!' as a hex encoded string
Buffer.from("6865796121", "hex");
8

// Creates a new buffer with the string 'heya!'
// If no enconding is passed in the second parameter, defaults to 'utf-8'.
Buffer.from("heya!");

// Creates the same buffer as the above, but passes 'heya!' as a hex encoded string
Buffer.from("6865796121", "hex");
2

Các trình trợ giúp lặp khác như

<Buffer 61 2e 71 3b 65 2e 31 2f 61 2e>
68,
<Buffer 61 2e 71 3b 65 2e 31 2f 61 2e>
69 và
<Buffer 61 2e 71 3b 65 2e 31 2f 61 2e>
90 cũng có sẵn cho bộ đệm. Ví dụ: sử dụng
<Buffer 61 2e 71 3b 65 2e 31 2f 61 2e>
68

// Creates a new buffer with the string 'heya!'
// If no enconding is passed in the second parameter, defaults to 'utf-8'.
Buffer.from("heya!");

// Creates the same buffer as the above, but passes 'heya!' as a hex encoded string
Buffer.from("6865796121", "hex");
3

Đi xa hơn. Bộ đệm và TypedArrays

Trong JavaScript (Ý tôi là JavaScript nói chung, không giới hạn ở Node. js), bộ nhớ có thể được cấp phát bằng lớp

// Also writes 'heya!' to the buffer, but passes a array of bytes
Buffer.from([0x68, 0x65, 0x79, 0x61, 0x21]);
1 đặc biệt. Chúng tôi hiếm khi thao tác trực tiếp đối tượng
// Also writes 'heya!' to the buffer, but passes a array of bytes
Buffer.from([0x68, 0x65, 0x79, 0x61, 0x21]);
1. Thay vào đó, chúng tôi sử dụng một tập hợp các đối tượng "xem" tham chiếu bộ đệm mảng bên dưới. Một số đối tượng xem là

<Buffer 61 2e 71 3b 65 2e 31 2f 61 2e>
94,
<Buffer 61 2e 71 3b 65 2e 31 2f 61 2e>
95,
<Buffer 61 2e 71 3b 65 2e 31 2f 61 2e>
96,
<Buffer 61 2e 71 3b 65 2e 31 2f 61 2e>
97,
<Buffer 61 2e 71 3b 65 2e 31 2f 61 2e>
98,
<Buffer 61 2e 71 3b 65 2e 31 2f 61 2e>
99, v.v. Xem danh sách đầy đủ ở đây

Và sau đó là

// Creates a new buffer with the string 'heya!'
// If no enconding is passed in the second parameter, defaults to 'utf-8'.
Buffer.from("heya!");

// Creates the same buffer as the above, but passes 'heya!' as a hex encoded string
Buffer.from("6865796121", "hex");
00, là một thuật ngữ chung để chỉ tất cả các đối tượng xem được liệt kê ở trên. Tất cả các đối tượng xem đều kế thừa các phương thức từ
// Creates a new buffer with the string 'heya!'
// If no enconding is passed in the second parameter, defaults to 'utf-8'.
Buffer.from("heya!");

// Creates the same buffer as the above, but passes 'heya!' as a hex encoded string
Buffer.from("6865796121", "hex");
00 thông qua các nguyên mẫu. Hàm tạo
// Creates a new buffer with the string 'heya!'
// If no enconding is passed in the second parameter, defaults to 'utf-8'.
Buffer.from("heya!");

// Creates the same buffer as the above, but passes 'heya!' as a hex encoded string
Buffer.from("6865796121", "hex");
00 không được hiển thị trên toàn cầu, bạn luôn phải sử dụng một trong các phương thức xem. Nếu bạn thấy một số hướng dẫn hoặc tài liệu sử dụng
// Creates a new buffer with the string 'heya!'
// If no enconding is passed in the second parameter, defaults to 'utf-8'.
Buffer.from("heya!");

// Creates the same buffer as the above, but passes 'heya!' as a hex encoded string
Buffer.from("6865796121", "hex");
03, điều đó có nghĩa là nó đang sử dụng bất kỳ đối tượng xem nào (Uint8Array, Float64Array, v.v.)

trong nút. js, các đối tượng được tạo từ lớp

// Creates a new buffer with the string 'heya!'
// If no enconding is passed in the second parameter, defaults to 'utf-8'.
Buffer.from("heya!");

// Creates the same buffer as the above, but passes 'heya!' as a hex encoded string
Buffer.from("6865796121", "hex");
4 cũng là phiên bản của
<Buffer 61 2e 71 3b 65 2e 31 2f 61 2e>
95. Có một vài sự khác biệt nhỏ giữa chúng, mà bạn có thể đọc ở đây

Phần kết luận

Khi mới bắt đầu, bộ đệm là một chủ đề trong Node. js khiến tôi rất bối rối (một cái khác là luồng, nhưng cái đó xứng đáng được đăng bài riêng). Hy vọng rằng tôi đã có thể làm sáng tỏ một số khái niệm xung quanh bộ đệm và đưa ra cái nhìn tổng quan về API bộ đệm

Làm cách nào để khởi tạo JavaScript bộ đệm trống?

Bạn có thể tạo vùng đệm trống với kích thước 10 byte. .
const buf1 = Bộ đệm. cấp phát(10);
const buf2 = Bộ đệm. từ ('Xin chào thế giới. .
const buf3 = Bộ đệm. allocUnsafe(10);
hãy để bộ đệmOne = Bộ đệm. from('Đây là một ví dụ về bộ đệm. '); . .
const emptyBuf = Bộ đệm. cấp phát(10); . .
trốngBuf. .
bảng điều khiển. .
bảng điều khiển

Là bộ đệm trong Node. luồng js?

Bộ đệm. Trong nút. js để thao tác luồng dữ liệu nhị phân, mô-đun bộ đệm có thể được bao gồm trong mã . Tuy nhiên, bộ đệm là một đối tượng toàn cầu trong Node. js, do đó không bắt buộc phải nhập nó vào mã bằng phương thức được yêu cầu.

Làm cách nào để kiểm tra xem bộ đệm có rỗng JavaScript không?

Sử dụng thuộc tính Count[^]. Nếu Đếm bằng 0 thì danh sách trống .

Nút đối tượng bộ đệm là gì?

Mô-đun bộ đệm cung cấp cách xử lý các luồng dữ liệu nhị phân. Đối tượng Buffer là đối tượng toàn cục trong Node. js và không cần thiết phải nhập nó bằng từ khóa yêu cầu.