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
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"];
8Nế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ệtTạ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. ,
0]. Cú pháp này hiện không được dùng nữa// Also writes 'heya!' to the buffer, but passes a array of bytes Buffer.from[[0x68, 0x65, 0x79, 0x61, 0x21]];
Đệ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ácKhi 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
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// Also writes 'heya!' to the buffer, but passes a array of bytes Buffer.from[[0x68, 0x65, 0x79, 0x61, 0x21]];
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
6Chú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
9Sau 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"];
0Bạ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"];
3Mộ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"];
5Nó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ảmGhi vào bộ đệm
Cách ghi dữ liệu vào bộ đệm đang sử dụng
62. Theo mặc định, nó sẽ ghi một chuỗi được mã hóa bằng
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"];
9Hã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"];
0Cũ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"];
1Mặ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
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"];
2Các trình trợ giúp lặp khác như
68,
69 và
90 cũng có sẵn cho bộ đệm. Ví dụ: sử dụng
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à
94,
95,
96,
97,
98,
99, v.v. Xem danh sách đầy đủ ở đâyVà 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
95. Có một vài sự khác biệt nhỏ giữa chúng, mà bạn có thể đọc ở đâyPhầ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