بافر ها Nodejs Buffers
بافر یک قسمتی از حافظه است. برنامه نویسان جاوااسکریپت با این مفهوم اشنا نیستند اما برنامه نویسان C و Go هرروز با حافظه کار میکنند.
بوفر تکه ای ثابت (غیر قابل تغییر) از حافظه است که خارج از موتور V8 جاوااسکریپت قرار داده شده است.
میتوان بوفر را همانند یک عضو از یک ارایه در نظر گرفت. هر بوفر یک مقدار کوچکی از داده ها را بازمیگرداند.
توسط کلاس Node.js Buffer پیاده سازی می شود.
چرا ما به بوفر نیازمندیم؟
بوفر آمد تا به توسعه دهندگان کمک کند بصورت باینری به داده ها دسترسی داشته باشند تا اینکه بروش سنتی با استرینگ سر و کار داشته باشند.
بوفر ها بطرز عمیقی با استریم ها در ارتباط هستند. وقتی پردازنده جریانی داده را سریعتر از هضم آن دریافت می کند ، داده را در یک بافر قرار می دهد.
یک تجسم ساده از یک بافر هنگامی است که شما در حال تماشای یک فیلم YouTube هستید و خط قرمز فراتر از نقطه تجسم شماست: شما در حال بارگیری داده ها سریعتر از آنچه هستید مشاهده می کنید و مرورگر شما آنها را بافر می کند.
چگونه یک بافر بسازیم؟
بافر با متد های Buffer.from()
, Buffer.alloc()
, و Buffer.allocUnsafe()
ساخته میشود.
const buf = Buffer.alloc(1024)
//or
const buf = Buffer.allocUnsafe(1024)
هر دو متد بالا alloc allocUnsafe میتوانند بافر بسازند. با alloc بافر ایجاد شده با صفر ها ایجاد میشود اما با allocUnsafe با صفر ها ایجاد نمیشود. بدین معنا که استفاده از alloc ممکن است کند تر باشد اما امن تر است. استفاده از allocUnsafe اگر چه سریع تر است اما بدلیل وجود داده های قبلی که حاوی داده های حساسی باشند امنیت ندارد.
استفاده از یک بافر
دسترسی به محتوای بافر
بافر مانند یک ارایه از داده هاست. بنابراین مانند یک عضو از ارایه قابل دسترس است
const buf = Buffer.from('Hey!')
console.log(buf[0]) //72
console.log(buf[1]) //101
console.log(buf[2]) //121
این اعداد UTF-8 bytes هستند که حروف را برمیگردانند. (H
→ 72
, e
→ 101
, y
→ 121
)
این اتفاق به این دلیل است که Buffer.from()
بصورت پیشفرض از UTF-8 بهره میبرد.
ممکن است برخی کاراکتر ها بیش از یک بایت در بافر محتوا داشته باشند é
→ 195 169
با متد toString()
تمام محتوای بافر را نمایش دهید
console.log(buf.toString())
متد buf.toString()
هم بصورت پیشفرض از UTF-8 استفاده میکند.
توجه داشته باشید که اگر یک بافر را با عددی تنظیم کنید که اندازه آن را تعیین کند ، به حافظه از پیش راه اندازی شده ای دسترسی خواهید داشت که شامل داده های تصادفی است ، نه یک بافر خالی!
اندازه یک بافر را بگیرید!
از پروپرتی length
کمک بگیرید:
const buf = Buffer.from('Hey!')
console.log(buf.length)
محتوای یک بافر را تکرار کنید!
const buf = Buffer.from('Hey!')
for (const item of buf) {
console.log(item) //72 101 121 33
}
تغییر محتوای یک بافر
شما با متد write()
میتوانید یک استرینگ از داده ها را درون بافر بریزید!
const buf = Buffer.alloc(4)
buf.write('Hey!')
همانطور که با قاعده نوشتاری ارایه میتوان با بافر ها رفتار کرد به همان گونه میتوان محتوا را تغییر داد:
const buf = Buffer.from('Hey!')
buf[1] = 111 //o in UTF-8
console.log(buf.toString()) //Hoy!
بافر و slice
اگر می خواهید روی بخشی از یک بافر کار کنید ، می توانید یک برش ایجاد کنید. اسلایس، کپی نیست: بافر اصلی هنوز همان خودش مانده است. اگر تغییر کند اسلایس هم تغییر میکند.
برای ساخت اسلایس از subarray()
بهره ببرید! پارامتر اول ضروری و پارامتر دوم اپشن است.
const buf = Buffer.from('Hey!')
buf.subarray(0).toString() //Hey!
const slice = buf.subarray(0, 2)
console.log(slice.toString()) //He
buf[1] = 111 //o
console.log(slice.toString()) //Ho
کپی کردن بافر
با متد set()
میتوانید یک بافر را کپی کنید
const buf = Buffer.from('Hey!')
let bufcopy = Buffer.alloc(4) //allocate 4 bytes
bufcopy.set(buf)
بصورت پیشفرض تمام بافر کپی میشود اما اگر بخشی از ان را میخواهید کپی کنید از .subarray()
به همراه offset
استفاده کنید:
const buf = Buffer.from('Hey?')
let bufcopy = Buffer.from('Moo!')
bufcopy.set(buf.subarray(1, 3), 1)
bufcopy.toString() //'Mey!'