الفرق بين المراجعتين لصفحة: «Node.js/buffer»

من موسوعة حسوب
أنشأ الصفحة ب'الاستقرار: 2-مستقر قبل تعريف نوع الكائن <code>TypedArray</code>، لم يكن لدى JavaScript أيَّة آلية لقراءة وت...'
 
ط استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{SUBPAGENAME}}'
 
(مراجعتان متوسطتان بواسطة مستخدم واحد آخر غير معروضتين)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:الصنف <code>‎‎‎Buffer</code>‎ في Node.js}}</noinclude>
الاستقرار: 2-مستقر
الاستقرار: 2-مستقر


سطر 31: سطر 32:
const buf6 = Buffer.from('tést', 'latin1');
const buf6 = Buffer.from('tést', 'latin1');
</syntaxhighlight>
</syntaxhighlight>
 
==التابع <code>Buffer.from()</code>‎، والتابع <code>Buffer.alloc()</code>‎، والتابع <code>Buffer.allocUnsafe()‎</code>==
== التابع <code>Buffer.from()</code>‎، والتابع <code>Buffer.alloc()</code>‎، والتابع <code>Buffer.allocUnsafe()‎</code> ==
في إصدارات Node.js ما قبل 6.0.0، تُنشَئ النسخ <code>Buffer</code> باستعمال دالة بانية تحجز جزءًا من الذاكرة للنسخة <code>Buffer</code> المعادة بطريقة تعتمد على الوسائط المُمرَّرة إليها وهي:
في إصدارات Node.js ما قبل 6.0.0، تُنشَئ النسخ <code>Buffer</code> باستعمال دالة بانية تحجز جزءًا من الذاكرة للنسخة <code>Buffer</code> المعادة بطريقة تعتمد على الوسائط المُمرَّرة إليها وهي:
* تمرير عدد كوسيط أول إلى الدالة <code>Buffer()‎</code> (مثل <code>new Buffer(10)‎</code>) يحجز جزءًا من الذاكرة المؤقتة بالحجم المعطى ويُسنَد إلى كائن <code>Buffer</code> جديد. قبل الإصدار Node.js 8.0.0، لا يهيئ جزء الذاكرة المحجوز لبعض نسخ <code>Buffer</code> ويمكن بذلك أن يحتوي على بيانات قديمة حسَّاسة. في هذه الحالة، يجب تهيئة جزء الذاكرة المحجوز إمَّا عبر استعمال <code>buf.fill(0)‎</code> لملء كامل الجزء المحجوز بأصفارٍ، أو عبر كتابة بيانات معيَّنة على كامل هذا الجزء.  لمَّا كان عدم تهيئة الجزء المحجوز سلوكًا متعمدًا يحسِّن الأداء، فقد أظهرت تجربة التطوير (development experience) أنَّه ينبغي التفريق بشكل واضح بين إنشاء كائن <code>Buffer</code> دون تهيئته ولكن بسرعة مقابل إنشاء كائن <code>Buffer</code> آمن ولكن ببطء.  بدءًا من الإصدار Node.js 8.0.0، يعيد استعمال الدالة بالشكل <code>Buffer(num)‎</code> و <code>new Buffer(num)‎</code> كائن <code>Buffer</code> مع تهيئة جزء الذاكرة المحجوز.
*تمرير عدد كوسيط أول إلى الدالة <code>Buffer()‎</code> (مثل <code>new Buffer(10)‎</code>) يحجز جزءًا من الذاكرة المؤقتة بالحجم المعطى ويُسنَد إلى كائن <code>Buffer</code> جديد. قبل الإصدار Node.js 8.0.0، لا يهيئ جزء الذاكرة المحجوز لبعض نسخ <code>Buffer</code> ويمكن بذلك أن يحتوي على بيانات قديمة حسَّاسة. في هذه الحالة، يجب تهيئة جزء الذاكرة المحجوز إمَّا عبر استعمال <code>buf.fill(0)‎</code> لملء كامل الجزء المحجوز بأصفارٍ، أو عبر كتابة بيانات معيَّنة على كامل هذا الجزء.  لمَّا كان عدم تهيئة الجزء المحجوز سلوكًا متعمدًا يحسِّن الأداء، فقد أظهرت تجربة التطوير (development experience) أنَّه ينبغي التفريق بشكل واضح بين إنشاء كائن <code>Buffer</code> دون تهيئته ولكن بسرعة مقابل إنشاء كائن <code>Buffer</code> آمن ولكن ببطء.  بدءًا من الإصدار Node.js 8.0.0، يعيد استعمال الدالة بالشكل <code>Buffer(num)‎</code> و <code>new Buffer(num)‎</code> كائن <code>Buffer</code> مع تهيئة جزء الذاكرة المحجوز.
* تمرير سلسلة نصية، أو مصفوفة، أو كائن <code>Buffer</code> كوسيط أول إلى الدالة <code>Buffer()‎</code> يؤدي إلى إنشاء كائن <code>Buffer</code> ونسخ بيانات ذلك الكائن المُمرَّر إليه.
*تمرير سلسلة نصية، أو مصفوفة، أو كائن <code>Buffer</code> كوسيط أول إلى الدالة <code>Buffer()‎</code> يؤدي إلى إنشاء كائن <code>Buffer</code> ونسخ بيانات ذلك الكائن المُمرَّر إليه.
* تمرير الكائن <code>ArrayBuffer</code> أو الكائن <code>SharedArrayBuffer</code> إلى الدالة <code>Buffer()‎</code> يعيد كائن <code>Buffer</code> يتشارك جزءًا من الذاكرة المؤقتة المحجوزة مع ذلك الكائن المعطى.
*تمرير الكائن <code>ArrayBuffer</code> أو الكائن <code>SharedArrayBuffer</code> إلى الدالة <code>Buffer()‎</code> يعيد كائن <code>Buffer</code> يتشارك جزءًا من الذاكرة المؤقتة المحجوزة مع ذلك الكائن المعطى.
لمَّا كان سلوك الدالة بالشكل <code>new Buffer()‎</code> يختلف تبعًا لنوع الوسيط الأول المُمرَّر إليها، فمن الممكن أن تتعرض التطبيقات عن غير قصد لمشكلات متعلقة بالأمن والوثوقيَّة عندما لا يُتحقَّق من صحة الوسيط الأول أو لا يهيأ جزء الذاكرة المحجوز.
لمَّا كان سلوك الدالة بالشكل <code>new Buffer()‎</code> يختلف تبعًا لنوع الوسيط الأول المُمرَّر إليها، فمن الممكن أن تتعرض التطبيقات عن غير قصد لمشكلات متعلقة بالأمن والوثوقيَّة عندما لا يُتحقَّق من صحة الوسيط الأول أو لا يهيأ جزء الذاكرة المحجوز.


سطر 42: سطر 42:


يجب على المطورين أن يتركوا استعمال الدالة <code>new Buffer()‎</code> البانية كليًّا يجميع أشكالها، وأن ينتقلوا إلى ما يقابلها من الواجهات البرمجيَّة الجديدة التالية:
يجب على المطورين أن يتركوا استعمال الدالة <code>new Buffer()‎</code> البانية كليًّا يجميع أشكالها، وأن ينتقلوا إلى ما يقابلها من الواجهات البرمجيَّة الجديدة التالية:
* التابع <code>Buffer.from(array)</code>‎: يعيد هذا التابع كائن <code>Buffer</code> جديد يحوي نسخةً من القيمة الثمانية المُمرَّرة إليه.
*التابع <code>Buffer.from(array)</code>‎: يعيد هذا التابع كائن <code>Buffer</code> جديد يحوي نسخةً من القيمة الثمانية المُمرَّرة إليه.
* التابع <code>Buffer.from(arrayBuffer[, byteOffset[, length]])</code>‎: يعيد كائن <code>Buffer</code> جديد يشارك الكائن <code>ArrayBuffer</code> المعطى جزءًا من الذاكرة المحجوز الخاص به.
*التابع <code>Buffer.from(arrayBuffer[, byteOffset[, length]])</code>‎: يعيد كائن <code>Buffer</code> جديد يشارك الكائن <code>ArrayBuffer</code> المعطى جزءًا من الذاكرة المحجوز الخاص به.
* التابع <code>Buffer.alloc(size[, fill[, encoding]])</code>‎: يعيد كائن <code>Buffer</code> مع حجز جزء ذي حجم مُحدَّد من الذاكرة المؤقتة وتهيئته. الجدير بالذكر أنَّ هذا التابع أبطأ من التابع <code>Buffer.allocUnsafe(size)</code>‎ ولكنه يضمن أنَّ نُسَخ <code>Buffer</code> المنشأة حديثًا آنذاك لا تحوي أيَّة بيانات قديمة يحتمل أن تكون معلومات حسَّاسة ومهمَّة.
*التابع <code>Buffer.alloc(size[, fill[, encoding]])</code>‎: يعيد كائن <code>Buffer</code> مع حجز جزء ذي حجم مُحدَّد من الذاكرة المؤقتة وتهيئته. الجدير بالذكر أنَّ هذا التابع أبطأ من التابع <code>Buffer.allocUnsafe(size)</code>‎ ولكنه يضمن أنَّ نُسَخ <code>Buffer</code> المنشأة حديثًا آنذاك لا تحوي أيَّة بيانات قديمة يحتمل أن تكون معلومات حسَّاسة ومهمَّة.
* التابع <code>Buffer.allocUnsafe(size)</code>‎ والتابع <code>Buffer.allocUnsafeSlow(size)</code>‎: يعيد كلًّا منهما كائن <code>Buffer</code> جديد دون تهيئة الحجم <code>size</code> المحجوز من الذاكرة المؤقتة آنذاك. بناءً على ذلك، قد يحتوي هذا الجزء المحجوز على بيانات قديمة يحتمل أن تكون حسَّاسة.
*التابع <code>Buffer.allocUnsafe(size)</code>‎ والتابع <code>Buffer.allocUnsafeSlow(size)</code>‎: يعيد كلًّا منهما كائن <code>Buffer</code> جديد دون تهيئة الحجم <code>size</code> المحجوز من الذاكرة المؤقتة آنذاك. بناءً على ذلك، قد يحتوي هذا الجزء المحجوز على بيانات قديمة يحتمل أن تكون حسَّاسة.
النسخ <code>Buffer</code> التي يعيدها التابع <code>Buffer.allocUnsafe()‎</code> قد تكون محجوزة خارج مُجمَّع الذاكرة الداخلي المشترك (shared internal memory pool) إن كانت قيمة الوسيط <code>size</code> أقل أو مساويةً لنصف القيمة <code>Buffer.poolSize</code>. أمَّا النُسخ التي يعيدها التابع <code>Buffer.allocUsafeSlow()</code>‎، فلا تستعمل مجمَّع الذاكرة الداخلية المشتركة مطلقًا.
النسخ <code>Buffer</code> التي يعيدها التابع <code>Buffer.allocUnsafe()‎</code> قد تكون محجوزة خارج مُجمَّع الذاكرة الداخلي المشترك (shared internal memory pool) إن كانت قيمة الوسيط <code>size</code> أقل أو مساويةً لنصف القيمة <code>Buffer.poolSize</code>. أمَّا النُسخ التي يعيدها التابع <code>Buffer.allocUsafeSlow()</code>‎، فلا تستعمل مجمَّع الذاكرة الداخلية المشتركة مطلقًا.
 
===الخيار ‎<code>--zero-fill-buffers</code> في سطر الأوامر===
=== الخيار ‎<code>--zero-fill-buffers</code> في سطر الأوامر ===
أضيف في الإصدار v5.10.0.
أضيف في الإصدار v5.10.0.


سطر 56: سطر 55:
<Buffer 00 00 00 00 00>
<Buffer 00 00 00 00 00>
</syntaxhighlight>
</syntaxhighlight>
 
===ما الذي يجعل استعمال التابع <code>Buffer.allocUnsafe()</code>‎ والتابع <code>Buffer.allocUnsafeSlow()</code>‎ غير آمن؟===
=== ما الذي يجعل استعمال التابع <code>Buffer.allocUnsafe()</code>‎ والتابع <code>Buffer.allocUnsafeSlow()</code>‎ غير آمن؟ ===
عند استدعاء التابع <code>Buffer.allocUnsafe()‎</code> والتابع <code>Buffer.allocUnsafeSlow()</code>‎، لا يُهيَّأ جزء الذاكرة المحجوز (لا تُمسَح البيانات القديمة الموجودة فيه سابقًا).لمَّا كان تصميم هذين التابعين يعتمد على السرعة في حجز جزءٍ من الذاكرة، فقد يحتوي هذا الجزء المحجوز على بيانات قديمة كُتبت فيه مسبقًا ربما تكون حسَّاسة. استعمال نسخة <code>Buffer</code> أنشأت باستخدام التابع <code>Buffer.allocUnsafe()‎</code> ودون إعادة كتابة بيانات جديدة في كامل جزء الذاكرة يؤدي إلى تسريب وكشف تلك البيانات القديمة عند قراءة النسخة <code>Buffer</code>.
عند استدعاء التابع <code>Buffer.allocUnsafe()‎</code> والتابع <code>Buffer.allocUnsafeSlow()</code>‎، لا يُهيَّأ جزء الذاكرة المحجوز (لا تُمسَح البيانات القديمة الموجودة فيه سابقًا).لمَّا كان تصميم هذين التابعين يعتمد على السرعة في حجز جزءٍ من الذاكرة، فقد يحتوي هذا الجزء المحجوز على بيانات قديمة كُتبت فيه مسبقًا ربما تكون حسَّاسة. استعمال نسخة <code>Buffer</code> أنشأت باستخدام التابع <code>Buffer.allocUnsafe()‎</code> ودون إعادة كتابة بيانات جديدة في كامل جزء الذاكرة يؤدي إلى تسريب وكشف تلك البيانات القديمة عند قراءة النسخة <code>Buffer</code>.


صحيحٌ أنَّ استعمال التابع <code>Buffer.allocUnsafe()‎</code> والتابع <code>Buffer.allocUnsafeSlow()‎</code> له ميزة كبيرة في تحسين الأداء إلا أنَّه يجب أخذ المزيد من الحيطة والحذر لتجنب وجود ثغرات تؤثِّر على الحماية.
صحيحٌ أنَّ استعمال التابع <code>Buffer.allocUnsafe()‎</code> والتابع <code>Buffer.allocUnsafeSlow()‎</code> له ميزة كبيرة في تحسين الأداء إلا أنَّه يجب أخذ المزيد من الحيطة والحذر لتجنب وجود ثغرات تؤثِّر على الحماية.
 
==ترميز المحارف==
== ترميز المحارف ==
{| class="wikitable mw-collapsible"
{| class="wikitable mw-collapsible"
|+سجل التغييرات
|+سجل التغييرات
سطر 73: سطر 70:
|v5.0.0
|v5.0.0
|إزالة الترميز raw والترميز raws اللذان كانا مهملين.
|إزالة الترميز raw والترميز raws اللذان كانا مهملين.
|}
|}يمكن تحديد ترميز المحارف المراد استعماله عند تخزين أو جلب سلسلة نصية من البيانات من النسخة <code>Buffer</code>.<syntaxhighlight lang="javascript">
يمكن تحديد ترميز المحارف المراد استعماله عند تخزين أو جلب سلسلة نصية من البيانات من النسخة <code>Buffer</code>.<syntaxhighlight lang="javascript">
const buf = Buffer.from('hello world', 'ascii');
const buf = Buffer.from('hello world', 'ascii');


سطر 87: سطر 83:
// <Buffer 66 00 68 00 71 00 77 00 68 00 67 00 61 00 64 00 73 00> :سيُطبع
// <Buffer 66 00 68 00 71 00 77 00 68 00 67 00 61 00 64 00 73 00> :سيُطبع
</syntaxhighlight>ترميزات المحارف التي تدعمها Node.js حاليًا هي:
</syntaxhighlight>ترميزات المحارف التي تدعمها Node.js حاليًا هي:
* <code>'ascii'</code>: ترمَّز المحارف باستعمال الترميز ASCII الذي يكون فيه حجم المحرف 7 بت فقط. يَقتطِع هذا الترميز البت الثامن الأكثر أهميَّة (MSB) من كامل البايت، ويوصف بسرعته الكبيرة.
*<code>'ascii'</code>: ترمَّز المحارف باستعمال الترميز ASCII الذي يكون فيه حجم المحرف 7 بت فقط. يَقتطِع هذا الترميز البت الثامن الأكثر أهميَّة (MSB) من كامل البايت، ويوصف بسرعته الكبيرة.
* <code>'utf8'</code>: ترمَّز المحارف باستعمال الترميز الموحَّد (Unicode) للمحارف متعدِّدة البايتات، وتستعمله أغلب صفحات الويب والمستندات.
*<code>'utf8'</code>: ترمَّز المحارف باستعمال الترميز الموحَّد (Unicode) للمحارف متعدِّدة البايتات، وتستعمله أغلب صفحات الويب والمستندات.
* <code>'utf16le'</code>: ترمَّز المحارف باستعمال الترميز الموحد بحجم 2 أو 4 بايت مع ضبط ترتيب تخزين البايتات الأكثر أهميَّة أولًا (little-endian). الأزواج البديلة (من U+10000 إلى U+10FFFF) مدعومةٌ أيضًا.
*<code>'utf16le'</code>: ترمَّز المحارف باستعمال الترميز الموحد بحجم 2 أو 4 بايت مع ضبط ترتيب تخزين البايتات الأكثر أهميَّة أولًا (little-endian). الأزواج البديلة (من U+10000 إلى U+10FFFF) مدعومةٌ أيضًا.
* <code>'ucs2'</code>: هو اسمٌ بديلٌ للترميز <code>'utf16le'</code>.
*<code>'ucs2'</code>: هو اسمٌ بديلٌ للترميز <code>'utf16le'</code>.
* <code>'base64'</code>: ترمَّز المحارف باستعمال الترميز Base64. عند إنشاء نسخة <code>Buffer</code> من سلسلة نصية، فسيَقبل هذا الترميز بشكل صحيح «الأبجدية الآمنة لعناوين URL وأسماء الملفات» كما هو مذكورٌ في [[rfc:4648#section-5|المعيار RFC4648]] في القسم الخامس.
*<code>'base64'</code>: ترمَّز المحارف باستعمال الترميز Base64. عند إنشاء نسخة <code>Buffer</code> من سلسلة نصية، فسيَقبل هذا الترميز بشكل صحيح «الأبجدية الآمنة لعناوين URL وأسماء الملفات» كما هو مذكورٌ في [[rfc:4648#section-5|المعيار RFC4648]] في القسم الخامس.
* <code>'latin1'</code>: ترمَّز البيانات إلى سلسلة نصية مرمَّزة ببايت واحد (one-byte encoded string) كما حدَّدته IANA في [[rfc:1345|المعيار RFC1346]] في الصفحة 63 ليكون كتلةً ملحقة بالترميز Latin-1 وشيفرات التحكم C0/C1.
*<code>'latin1'</code>: ترمَّز البيانات إلى سلسلة نصية مرمَّزة ببايت واحد (one-byte encoded string) كما حدَّدته IANA في [[rfc:1345|المعيار RFC1346]] في الصفحة 63 ليكون كتلةً ملحقة بالترميز Latin-1 وشيفرات التحكم C0/C1.
* <code>'binary'</code>: اسمٌ بديلٌ للترميز <code>'latin1'</code>.
*<code>'binary'</code>: اسمٌ بديلٌ للترميز <code>'latin1'</code>.
* <code>'hex'</code>: يرمَّز كلُّ بايت بمحرفين ست عشريين.
*<code>'hex'</code>: يرمَّز كلُّ بايت بمحرفين ست عشريين.
تتبع متصفحات الويب الحديثة معيار الترميز [https://encoding.spec.whatwg.org/ WHATWG] الذي أصبح فيه الترميز 'latin1' والترميز 'ISO-8859-1' اسمين بديلين للترميز 'win-1252'. هذا يعني أنَّه إن أعيدت بيانات أثناء إجراء بعض العمليات، مثل <code>http.get()</code>‎، وكانت مرمَّزة بإحدى الترميزات المدرجة في معيار WHATWG، فمن المحتمل أنَّ الخادم قد أعاد تلك البيانات بترميز 'win-1252'؛ في هذه الحالة، يؤدي استعمال الترميز 'latin1' إلى فك ترميزها عن طريق الخطأ.
تتبع متصفحات الويب الحديثة معيار الترميز [https://encoding.spec.whatwg.org/ WHATWG] الذي أصبح فيه الترميز 'latin1' والترميز 'ISO-8859-1' اسمين بديلين للترميز 'win-1252'. هذا يعني أنَّه إن أعيدت بيانات أثناء إجراء بعض العمليات، مثل <code>http.get()</code>‎، وكانت مرمَّزة بإحدى الترميزات المدرجة في معيار WHATWG، فمن المحتمل أنَّ الخادم قد أعاد تلك البيانات بترميز 'win-1252'؛ في هذه الحالة، يؤدي استعمال الترميز 'latin1' إلى فك ترميزها عن طريق الخطأ.
 
==الصنف Buffer والكائن TypedArray==
== الصنف Buffer والكائن TypedArray ==
{| class="wikitable mw-collapsible"
|+
|}
{| class="wikitable mw-collapsible"
{| class="wikitable mw-collapsible"
|+سجل التغييرات
|+سجل التغييرات
سطر 108: سطر 100:
|v3.0.0
|v3.0.0
|أصبح الصنف Buffer يرث من الكائن Uint8Array.
|أصبح الصنف Buffer يرث من الكائن Uint8Array.
|}
|}النسخ <code>Buffer</code> هي أيضًا نسخ <code>Uint8Array</code>. مع ذلك، هنالك مشكلات غامضة متعلقة بالتوافقيَّة مع الكائن <code>TypedArray</code>. على سبيل المثال، ينشئ التابع <code>ArrayBuffer.slice()‎</code> كائن <code>ArrayBuffer</code> جديد يحوي نسخةً من الجزء المحدَّد من البيانات، بينما يعيد تنفيذ التابع نفسه بالشكل <code>Buffer.slice()‎</code> مرجعًا يشير إلى الجزء المحدَّد من البيانات للنسخة <code>Buffer</code> الموجودة ولا ينسخها. بناءً على ذلك، يكون استعمال <code>Buffer.slice()‎</code> أكثر كفاءةً.
النسخ <code>Buffer</code> هي أيضًا نسخ <code>Uint8Array</code>. مع ذلك، هنالك مشكلات غامضة متعلقة بالتوافقيَّة مع الكائن <code>TypedArray</code>. على سبيل المثال، ينشئ التابع <code>ArrayBuffer.slice()‎</code> كائن <code>ArrayBuffer</code> جديد يحوي نسخةً من الجزء المحدَّد من البيانات، بينما يعيد تنفيذ التابع نفسه بالشكل <code>Buffer.slice()‎</code> مرجعًا يشير إلى الجزء المحدَّد من البيانات للنسخة <code>Buffer</code> الموجودة ولا ينسخها. بناءً على ذلك، يكون استعمال <code>Buffer.slice()‎</code> أكثر كفاءةً.


من الممكن أيضًا إنشاء نُسَخ <code>TypedArray</code> جديدة من الكائن <code>Buffer</code> مع الانتباه إلى الأمرين التاليين:
من الممكن أيضًا إنشاء نُسَخ <code>TypedArray</code> جديدة من الكائن <code>Buffer</code> مع الانتباه إلى الأمرين التاليين:
# تُنسَخ محتويات ذاكرة الكائن <code>Buffer</code> إلى الكائن <code>TypedArray</code> ولا تُشارَك معه.
#تُنسَخ محتويات ذاكرة الكائن <code>Buffer</code> إلى الكائن <code>TypedArray</code> ولا تُشارَك معه.
# تُفسَّر ذاكرة الكائن <code>Buffer</code> على أنَّها مصفوفة من عناصر مختلفة وليست مصفوفة من البايتات من النوع المستهدف. نتيجةً لذلك، نجد أنَّ <code>new Uint32Array(Buffer.from([1, 2, 3, 4]))‎</code> ينشئ أربعة عناصر من النسخة <code>Uint32Array</code> هي <code>[1, 2, 3, 4]</code> وليس نسخة من العنصر الوحيد <code>[0x1020304]</code> أو <code>[0x4030201]</code>.
#تُفسَّر ذاكرة الكائن <code>Buffer</code> على أنَّها مصفوفة من عناصر مختلفة وليست مصفوفة من البايتات من النوع المستهدف. نتيجةً لذلك، نجد أنَّ <code>new Uint32Array(Buffer.from([1, 2, 3, 4]))‎</code> ينشئ أربعة عناصر من النسخة <code>Uint32Array</code> هي <code>[1, 2, 3, 4]</code> وليس نسخة من العنصر الوحيد <code>[0x1020304]</code> أو <code>[0x4030201]</code>.
يمكن أيضًا إنشاء نسخة <code>Buffer</code> جديدة تتشارك جزء الذاكرة الحجوز نفسه كنسخة <code>TypedArray</code> عبر استعمال الخاصِّيَّة <code>‎.buffer</code> للكائن <code>TypeArray</code>.<syntaxhighlight lang="javascript">
يمكن أيضًا إنشاء نسخة <code>Buffer</code> جديدة تتشارك جزء الذاكرة الحجوز نفسه كنسخة <code>TypedArray</code> عبر استعمال الخاصِّيَّة <code>‎.buffer</code> للكائن <code>TypeArray</code>.<syntaxhighlight lang="javascript">
const arr = new Uint16Array(2);
const arr = new Uint16Array(2);
سطر 143: سطر 134:
// 16 :سيُطبع
// 16 :سيُطبع
</syntaxhighlight>يختلف التابعان <code>buffer.from()‎</code> و <code>TypedArray.from()‎</code> في الشكل وطريقة التنفيذ، إذ تقبل المتغيرات <code>TypedArray</code> أن يُمرَّر لها دالة كوسيط ثانٍ لاستدعائها مع كل عنصر من عناصرها:
</syntaxhighlight>يختلف التابعان <code>buffer.from()‎</code> و <code>TypedArray.from()‎</code> في الشكل وطريقة التنفيذ، إذ تقبل المتغيرات <code>TypedArray</code> أن يُمرَّر لها دالة كوسيط ثانٍ لاستدعائها مع كل عنصر من عناصرها:
* <code>TypedArray.from(source[, mapFn[, thisArg]])‎</code>
*<code>TypedArray.from(source[, mapFn[, thisArg]])‎</code>
بينما لا يدعم التابع <code>Buffer.from()‎</code> استعمال مثل تلك الدالة:
بينما لا يدعم التابع <code>Buffer.from()‎</code> استعمال مثل تلك الدالة:
* <code>Buffer.from(array)‎</code>
*<code>Buffer.from(array)‎</code>
* <code>Buffer.from(buffer)‎</code>
*<code>Buffer.from(buffer)‎</code>
* <code>Buffer.from(arrayBuffer[, byteOffset[, length]])‎</code>
*<code>Buffer.from(arrayBuffer[, byteOffset[, length]])‎</code>
* <code>Buffer.from(string[, encoding])‎</code>
*<code>Buffer.from(string[, encoding])‎</code>
 
==الصنف Buffer والتكرار (iteration)==
== الصنف Buffer والتكرار (iteration) ==
يمكن وضع النسخ <code>Buffer</code> في حلقة تكراريَّة عبر استعمال الصيغة <code>[[JavaScript/for...of|for..of]]</code>:<syntaxhighlight lang="javascript">
يمكن وضع النسخ <code>Buffer</code> في حلقة تكراريَّة عبر استعمال الصيغة <code>[[JavaScript/for...of|for..of]]</code>:<syntaxhighlight lang="javascript">
const buf = Buffer.from([1, 2, 3]);
const buf = Buffer.from([1, 2, 3]);
سطر 162: سطر 152:
}
}
</syntaxhighlight>أضف إلى ذلك أنَّ التوابع <code>buf.values()</code>‎، و <code>buf.keys()‎</code>، و <code>buf.entries()‎</code> يمكن استعمالها لإنشاء مكرارات (iterators).
</syntaxhighlight>أضف إلى ذلك أنَّ التوابع <code>buf.values()</code>‎، و <code>buf.keys()‎</code>، و <code>buf.entries()‎</code> يمكن استعمالها لإنشاء مكرارات (iterators).
 
==الصنف Buffer==
== الصنف Buffer ==
الصنف <code>Buffer</code> هو نوعٌ عامٌّ يُستعمَل للتعامل مع البيانات الثنائيَّة بشكل مباشر، ويمكن إنشاؤه بطرائق عدَّة سنذكرها جميعها.
الصنف <code>Buffer</code> هو نوعٌ عامٌّ يُستعمَل للتعامل مع البيانات الثنائيَّة بشكل مباشر، ويمكن إنشاؤه بطرائق عدَّة سنذكرها جميعها.
 
===<code>Buffer(array)‎</code>===
=== <code>Buffer(array)‎</code> ===
{| class="wikitable mw-collapsible"
{| class="wikitable mw-collapsible"
|+سجل التغييرات
|+سجل التغييرات
سطر 183: سطر 171:
|v6.0.0
|v6.0.0
|أهملت هذه الدالة.
|أهملت هذه الدالة.
|}
|}الاستقرار: 0-مهمل: استعمل التابع <code>Buffer.from(array)‎</code> عوضًا عن هذه الدالة.
الاستقرار: 0-مهمل: استعمل التابع <code>Buffer.from(array)‎</code> عوضًا عن هذه الدالة.
*<code>array</code>: ‏[[JavaScript/Number|integer[]>‎>]] مصفوفةٌ من البايتات المراد نسخها.
 
==== المعاملات ====
* <code>array</code>: ‏[[JavaScript/Number|integer[]>‎>]] مصفوفةٌ من البايتات المراد نسخها.
تنشئ هذه الدالة نسخة <code>Buffer</code> جديدة وتحجز جزءًا من ذاكرة التخزين المؤقت تضع فيه نسخةً من محتويات المعامل <code>array</code> المعطى.<syntaxhighlight lang="javascript">
تنشئ هذه الدالة نسخة <code>Buffer</code> جديدة وتحجز جزءًا من ذاكرة التخزين المؤقت تضع فيه نسخةً من محتويات المعامل <code>array</code> المعطى.<syntaxhighlight lang="javascript">
// UTF-8 بترميز 'buffer' جديدة تحتوي على بايتات السلسلة النصية Buffer إنشاء نسخة
// UTF-8 بترميز 'buffer' جديدة تحتوي على بايتات السلسلة النصية Buffer إنشاء نسخة
const buf = new Buffer([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);
const buf = new Buffer([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);
</syntaxhighlight>
</syntaxhighlight>
 
===<code>Buffer(arrayBuffer[, byteOffset[, length]])‎</code>===
=== <code>Buffer(arrayBuffer[, byteOffset[, length]])‎</code> ===
{| class="wikitable mw-collapsible"
{| class="wikitable mw-collapsible"
|+سجل التغييرات
|+سجل التغييرات
سطر 216: سطر 200:
|v3.0.0
|v3.0.0
|أضيفت هذه الدالة.
|أضيفت هذه الدالة.
|}
|}الاستقرار: 0-مهمل: استعمل التابع <code>Buffer.from(arrayBuffer[, byteOffset[, length]])‎</code> عوضًا عن هذه الدالة.
الاستقرار: 0-مهمل: استعمل التابع <code>Buffer.from(arrayBuffer[, byteOffset[, length]])‎</code> عوضًا عن هذه الدالة.
*<code>arrayBuffer</code>: ‏<ArrayBuffer> | <SharedArrayBuffer> كائنٌ من النوع ArrayBuffer أو من النوع SharedArrayBuffer أو الخاصِّيَّة ‎.buffer للكائن TypedBuffer.
* <code>arrayBuffer</code>: ‏<ArrayBuffer> | <SharedArrayBuffer> كائنٌ من النوع ArrayBuffer أو من النوع SharedArrayBuffer أو الخاصِّيَّة ‎.buffer للكائن TypedBuffer.
*<code>byteOffset</code>: ‏[[JavaScript/Number|<integer>]] فهرس البايت الأول الذي سيبدأ عنده مشاركة جزءٍ من الذاكرة. القيمة الافتراضية هي: 0.
* <code>byteOffset</code>: ‏[[JavaScript/Number|<integer>]] فهرس البايت الأول الذي سيبدأ عنده مشاركة جزءٍ من الذاكرة. القيمة الافتراضية هي: 0.
*<code>length</code>: ‏[[JavaScript/Number|<integer>]] عدد بايتات الذاكرة المراد مشاركتها. القيمة الافتراضيَّة هي: <code>arrayBuffer.length - byteOffset</code>.
* <code>length</code>: ‏[[JavaScript/Number|<integer>]] عدد بايتات الذاكرة المراد مشاركتها. القيمة الافتراضيَّة هي: <code>arrayBuffer.length - byteOffset</code>.
تنشئ هذه الدالة نسخة <code>Buffer</code> جديدة وتتشارك جزء الذاكرة الخاص بالكائن <code>ArrayBuffer</code> أو <code>SharedArrayBuffer</code> دون نسخ ما يحتويه. عندما نُمرِّر مثلًا مرجعًا للخاصِّيَّة ‎<code>.buffer</code> في النسخة <code>TypedArray</code>، فستتشارك النسخة <code>Buffer</code> الجديدة المنشأة آنذاك مع نفس الذاكرة المحجوزة من طرف <code>TypedArray</code>.
تنشئ هذه الدالة نسخة <code>Buffer</code> جديدة وتتشارك جزء الذاكرة الخاص بالكائن <code>ArrayBuffer</code> أو <code>SharedArrayBuffer</code> دون نسخ ما يحتويه. عندما نُمرِّر مثلًا مرجعًا للخاصِّيَّة ‎<code>.buffer</code> في النسخة <code>TypedArray</code>، فستتشارك النسخة <code>Buffer</code> الجديدة المنشأة آنذاك مع نفس الذاكرة المحجوزة من طرف <code>TypedArray</code>.


سطر 241: سطر 224:
// <Buffer 88 13 70 17> :سيطبع
// <Buffer 88 13 70 17> :سيطبع
</syntaxhighlight>
</syntaxhighlight>
 
===<code>Buffer(buffer)‎</code>===
=== <code>Buffer(buffer)‎</code> ===
{| class="wikitable mw-collapsible"
{| class="wikitable mw-collapsible"
|+سجل التغييرات
|+سجل التغييرات
سطر 259: سطر 241:
|v6.0.0
|v6.0.0
|أهملت هذه الدالة.
|أهملت هذه الدالة.
|}
|}الاستقرار: 0-مهمل: استعمل <code>Buffer.from(buffer)‎</code> عوضًا عن هذه الدالة.
الاستقرار: 0-مهمل: استعمل <code>Buffer.from(buffer)‎</code> عوضًا عن هذه الدالة.
*<code>buffer</code>: ‏<Buffer> | <Uint8Array> نسخةٌ من <code>Buffer</code> أو <code>Unit8Array</code> يراد نسخ البيانات منها.
* <code>buffer</code>: ‏<Buffer> | <Uint8Array> نسخةٌ من <code>Buffer</code> أو <code>Unit8Array</code> يراد نسخ البيانات منها.
تنشئ هذه الدالة نسخة <code>Buffer</code> جديدة وتضع فيها نسخةً من محتوى المعامل <code>buffer</code> المعطى.<syntaxhighlight lang="javascript">
تنشئ هذه الدالة نسخة <code>Buffer</code> جديدة وتضع فيها نسخةً من محتوى المعامل <code>buffer</code> المعطى.<syntaxhighlight lang="javascript">
const buf1 = new Buffer('buffer');
const buf1 = new Buffer('buffer');
سطر 273: سطر 254:
// buffer :سيطبع
// buffer :سيطبع
</syntaxhighlight>
</syntaxhighlight>
 
===<code>Buffer(size)‎</code>===
==== <code>Buffer(size)‎</code> ====
{| class="wikitable mw-collapsible"
{| class="wikitable mw-collapsible"
|+سجل التغييرات
|+سجل التغييرات
سطر 294: سطر 274:
|v6.0.0
|v6.0.0
|أُهملَت هذه الدالة.
|أُهملَت هذه الدالة.
|}
|}الاستقرار: 0-مهمل: استعمل التابع <code>Buffer.alloc()‎</code> عوضًا عن هذه الدالة (انظر أيضًا التابع <code>Buffer.allocUnsafe()</code>‎).
الاستقرار: 0-مهمل: استعمل التابع <code>Buffer.alloc()‎</code> عوضًا عن هذه الدالة (انظر أيضًا التابع <code>Buffer.allocUnsafe()</code>‎).
*<code>size</code>: ‏[[JavaScript/Number|<integer>]] حجم الذاكرة المراد حجزه للنسخة <code>Buffer</code> المنشأة.
* <code>size</code>: ‏[[JavaScript/Number|<integer>]] حجم الذاكرة المراد حجزه للنسخة <code>Buffer</code> المنشأة.
تنشئ هذه الدالة نسخة <code>Buffer</code> جديدة وتحجز لها جزءًا من الذاكرة بالحجم <code>size</code> المعطى. إن كانت قيمة المعامل <code>size</code> المعطاة أكبر من <code>buffer.constants.MAX_LENGTH</code> أو أصغر من الصفر، فسيرمى الخطأ <code>ERR_INVALID_OPT_VALUE</code>. الجدير بالذكر أنَّه تُنشَأ النسخة <code>Buffer</code> إن أعطيت القيمة 0 للمعامل <code>size</code>.
تنشئ هذه الدالة نسخة <code>Buffer</code> جديدة وتحجز لها جزءًا من الذاكرة بالحجم <code>size</code> المعطى. إن كانت قيمة المعامل <code>size</code> المعطاة أكبر من <code>buffer.constants.MAX_LENGTH</code> أو أصغر من الصفر، فسيرمى الخطأ <code>ERR_INVALID_OPT_VALUE</code>. الجدير بالذكر أنَّه تُنشَأ النسخة <code>Buffer</code> إن أعطيت القيمة 0 للمعامل <code>size</code>.


سطر 305: سطر 284:
// <Buffer 00 00 00 00 00 00 00 00 00 00> :سيُطبَع
// <Buffer 00 00 00 00 00 00 00 00 00 00> :سيُطبَع
</syntaxhighlight>
</syntaxhighlight>
 
===<code>Buffer(string[, encoding])‎</code>===
==== <code>Buffer(string[, encoding])‎</code> ====
{| class="wikitable mw-collapsible"
{| class="wikitable mw-collapsible"
|+سجل التغييرات
|+سجل التغييرات
سطر 323: سطر 301:
|v6.0.0
|v6.0.0
|أُهملَت هذه الدالة.
|أُهملَت هذه الدالة.
|}
|}الاستقرار: 0-مهمل: استعمل التابع <code>Buffer.from(string[, encoding])‎</code> عوضًا عن هذه الدالة.
الاستقرار: 0-مهمل: استعمل التابع <code>Buffer.from(string[, encoding])‎</code> عوضًا عن هذه الدالة.
*<code>string</code>: ‏[[JavaScript/String|<string>]] السلسلة النصية المراد ترميزها ووضعها في النسخة <code>Buffer</code> المنشأة.
* <code>string</code>: ‏[[JavaScript/String|<string>]] السلسلة النصية المراد ترميزها ووضعها في النسخة <code>Buffer</code> المنشأة.
*<code>encoding</code>: ‏[[JavaScript/String|<string>]] الترميز المراد استعماله مع السلسلة النصية <code>string</code> المعطاة. القيمة الافتراضيَّة هي: <code>'utf8'</code>.
* <code>encoding</code>: ‏[[JavaScript/String|<string>]] الترميز المراد استعماله مع السلسلة النصية <code>string</code> المعطاة. القيمة الافتراضيَّة هي: <code>'utf8'</code>.
تنشئ هذه الدالة نسخة <code>Buffer</code> جديدة وتضع فيها السلسلة النصية <code>string</code> المعطاة بعد ترميزها باستعمال الترميز المحدَّد في المعامل <code>encoding</code>.<syntaxhighlight lang="javascript">
تنشئ هذه الدالة نسخة <code>Buffer</code> جديدة وتضع فيها السلسلة النصية <code>string</code> المعطاة بعد ترميزها باستعمال الترميز المحدَّد في المعامل <code>encoding</code>.<syntaxhighlight lang="javascript">
const buf1 = new Buffer('this is a tést');
const buf1 = new Buffer('this is a tést');
سطر 338: سطر 315:
// this is a tC)st :سيُطبَع
// this is a tC)st :سيُطبَع
</syntaxhighlight>
</syntaxhighlight>
 
===<code>Buffer.alloc(size[, fill[, encoding]])‎</code>===
==== <code>Buffer.alloc(size[, fill[, encoding]])‎</code> ====
{| class="wikitable mw-collapsible"
{| class="wikitable mw-collapsible"
|+سجل التغييرات
|+سجل التغييرات
سطر 357: سطر 333:
|أضيف هذا التابع.
|أضيف هذا التابع.
|}
|}
* <code>size</code>: ‏[[JavaScript/String|<integer>]] حجم الذاكرة المراد حجزه للنسخة Buffer المنشأة.
*<code>size</code>: ‏[[JavaScript/String|<integer>]] حجم الذاكرة المراد حجزه للنسخة Buffer المنشأة.
* <code>fill</code>: ‏‏[[JavaScript/String|<string>]] | ‏<Buffer>‏‏ | ‏[[JavaScript/Number|<integer>]]‏ القيمة الأوليَّة للنسخة <code>Buffer</code> الجديدة التي ستُوضع في الذاكرة عند حجزها. القيمة الافتراضيَّة هي: 0.
*<code>fill</code>: ‏‏[[JavaScript/String|<string>]] | ‏<Buffer>‏‏ | ‏[[JavaScript/Number|<integer>]]‏ القيمة الأوليَّة للنسخة <code>Buffer</code> الجديدة التي ستُوضع في الذاكرة عند حجزها. القيمة الافتراضيَّة هي: 0.
* <code>encoding</code>: ‏[[JavaScript/String|<string>]] إن كان المعامل <code>fill</code> سلسلة نصية، فستمثل قيمة هذا المعامل الترميز المستعمل معها. القيمة الافتراضيَّة هي: <code>'utf8'</code>.
*<code>encoding</code>: ‏[[JavaScript/String|<string>]] إن كان المعامل <code>fill</code> سلسلة نصية، فستمثل قيمة هذا المعامل الترميز المستعمل معها. القيمة الافتراضيَّة هي: <code>'utf8'</code>.
تنشئ هذه الدالة نسخة Buffer جديدة وتحجز لها جزءًا من الذاكرة بالحجم size المعطى. إن لم يعطَ المعامل fill أو أعطي وكانت قيمته undefined، فستملأ الذاكرة المحجوزة بأصفار كقيمة أوليَّة.<syntaxhighlight lang="javascript">
تنشئ هذه الدالة نسخة Buffer جديدة وتحجز لها جزءًا من الذاكرة بالحجم size المعطى. إن لم يعطَ المعامل fill أو أعطي وكانت قيمته undefined، فستملأ الذاكرة المحجوزة بأصفار كقيمة أوليَّة.<syntaxhighlight lang="javascript">
const buf = Buffer.alloc(5);
const buf = Buffer.alloc(5);
سطر 380: سطر 356:


سيرمى الخطأ <code>TypeError</code> إن لم يكن المعامل <code>size</code> عددًا.
سيرمى الخطأ <code>TypeError</code> إن لم يكن المعامل <code>size</code> عددًا.
 
=== <code>Buffer.allocUnsafe(size)</code>===
==== <code>Buffer.allocUnsafe(size)</code> ====
{| class="wikitable mw-collapsible"
{| class="wikitable mw-collapsible"
|+سجل التغييرات
|+سجل التغييرات
سطر 393: سطر 368:
|أضيف هذا التابع.
|أضيف هذا التابع.
|}
|}
* <code>size</code>: ‏[[JavaScript/Number|<integer>]] حجم الذاكرة المراد حجزه للنسخة <code>Buffer</code> المنشأة.
*<code>size</code>: ‏[[JavaScript/Number|<integer>]] حجم الذاكرة المراد حجزه للنسخة <code>Buffer</code> المنشأة.
تنشئ هذه الدالة نسخة <code>Buffer</code> جديدة وتحجز لها جزءًا من الذاكرة بالحجم <code>size</code> المعطى. إن كانت قيمة المعامل <code>size</code> المعطاة أكبر من <code>buffer.constants.MAX_LENGTH</code> أو أصغر من الصفر، فسيرمى الخطأ <code>ERR_INVALID_OPT_VALUE</code>. الجدير بالذكر أنَّه تنشأ النسخة <code>Buffer</code> إن أعطيت القيمة 0 للمعامل <code>size</code>.
تنشئ هذه الدالة نسخة <code>Buffer</code> جديدة وتحجز لها جزءًا من الذاكرة بالحجم <code>size</code> المعطى. إن كانت قيمة المعامل <code>size</code> المعطاة أكبر من <code>buffer.constants.MAX_LENGTH</code> أو أصغر من الصفر، فسيرمى الخطأ <code>ERR_INVALID_OPT_VALUE</code>. الجدير بالذكر أنَّه تنشأ النسخة <code>Buffer</code> إن أعطيت القيمة 0 للمعامل <code>size</code>.


سطر 411: سطر 386:


استعمال هذا الحجز الداخلي المسبق لكتلة (pool) من الذاكرة هو جوهر الاختلاف بين الاستدعاء <code>Buffer.alloc(size, fill)‎</code> والاستدعاء <code>Buffer.allocUnsafe(size).fill(fill)‎</code>. بناءً على ذلك، نجد أنَّ <code>Buffer.alloc(size, fill)‎</code> لا يستخدم هذه الكتلة من الذاكرة المحجوزة مسبقًا بينما يستعملها التابع <code>Buffer.allocUnsafe(size).fill(fill)‎</code> إن كانت قيمة <code>size</code> أصغر أو تساوي نصف القيمة <code>Buffer.poolSize</code>. قد يكون الفرق غامضًا بعض الشيء إلا أنَّه يلعب دورًا مهمًا في تسريع الأداء الذي يستطيع <code>Buffer.allocUnsafe()‎</code> أن يوفِّره خصوصًا عندما يتطلب التطبيق ذلك.
استعمال هذا الحجز الداخلي المسبق لكتلة (pool) من الذاكرة هو جوهر الاختلاف بين الاستدعاء <code>Buffer.alloc(size, fill)‎</code> والاستدعاء <code>Buffer.allocUnsafe(size).fill(fill)‎</code>. بناءً على ذلك، نجد أنَّ <code>Buffer.alloc(size, fill)‎</code> لا يستخدم هذه الكتلة من الذاكرة المحجوزة مسبقًا بينما يستعملها التابع <code>Buffer.allocUnsafe(size).fill(fill)‎</code> إن كانت قيمة <code>size</code> أصغر أو تساوي نصف القيمة <code>Buffer.poolSize</code>. قد يكون الفرق غامضًا بعض الشيء إلا أنَّه يلعب دورًا مهمًا في تسريع الأداء الذي يستطيع <code>Buffer.allocUnsafe()‎</code> أن يوفِّره خصوصًا عندما يتطلب التطبيق ذلك.
 
===<code>Buffer.allocUnsafeSlow(size)‎</code>===
==== <code>Buffer.allocUnsafeSlow(size)‎</code> ====
أضيف في الإصدار v5.12.0.
أضيف في الإصدار v5.12.0.
* size: ‏<integer> حجم الذاكرة المراد حجزه للنسخة Buffer المنشأة.
*<code>size</code>: ‏[[JavaScript/Number|<integer>]] حجم الذاكرة المراد حجزه للنسخة <code>Buffer</code> المنشأة.
تنشئ هذه الدالة نسخة Buffer جديدة وتحجز لها من الذاكرة الحجم size المعطى. إن كانت قيمة المعامل size المعطاة أكبر من buffer.constants.MAX_LENGTH أو أصغر من الصفر، فسيرمى الخطأ ERR_INVALID_OPT_VALUE. الجدير بالذكر أنَّه تنشأ النسخة Buffer إن أعطيت القيمة 0 للمعامل size.
تنشئ هذه الدالة نسخة <code>Buffer</code> جديدة وتحجز لها من الذاكرة الحجم <code>size</code> المعطى. إن كانت قيمة المعامل size المعطاة أكبر من <code>buffer.constants.MAX_LENGTH</code> أو أصغر من الصفر، فسيرمى الخطأ <code>ERR_INVALID_OPT_VALUE</code>. الجدير بالذكر أنَّه تنشأ النسخة <code>Buffer</code> إن أعطيت القيمة 0 للمعامل <code>size</code>.


انتبه إلى أنَّ هذا التابع لا يهيئ الذاكرة التي يحجزها عند استعماله لإنشاء نسخٍ من Buffer. نتيجةً لذلك، لا يُعرف المحتوى الأولي للنسخة Buffer المنشأة آنذاك وقد يكون بعض البيانات الحسَّاسة التي كتبت على تلك الذاكرة مسبقًا. إن أردت تهيئة جزء الذاكرة المحجوز ووضع قيمة أولية معروفة فيه، فاستعمل التابع buf.fill()‎.
انتبه إلى أنَّ هذا التابع لا يهيئ الذاكرة التي يحجزها عند استعماله لإنشاء نسخٍ من <code>Buffer</code>. نتيجةً لذلك، لا يُعرف المحتوى الأولي للنسخة <code>Buffer</code> المنشأة آنذاك وقد يكون بعض البيانات الحسَّاسة التي كتبت على تلك الذاكرة مسبقًا. إن أردت تهيئة جزء الذاكرة المحجوز ووضع قيمة أولية معروفة فيه، فاستعمل التابع <code>buf.fill()</code>‎.


عند استعمال Buffer.allocUnsafe()‎ لإنشاء نسخٍ جديدة من Buffer، فستُقتَطَع حجوزات الذاكرة التي تقل عن 4 كيلوبايت من نسخة Buffer واحدة محجوزة مسبقًا (التي شُرحت آنفًا). هذا يساعد التطبيقات على تجنب زيادة مجمَّع المهملات (garbage allocation) عبر تقليل إنشاء نسخ Buffer جديدة وحجز أجزاء من الذاكرة بشكل فردي. يحسِّن ذلك الأداء واستخدام الذاكرة عبر تقليل الحاجة إلى تتبُّع وإزالة أقل قدر ممكن من الكائنات الموجودة والمتكررة.
عند استعمال <code>Buffer.allocUnsafe()‎</code> لإنشاء نسخٍ جديدة من <code>Buffer</code>، فستُقتَطَع حجوزات الذاكرة التي تقل عن 4 كيلوبايت من نسخة <code>Buffer</code> واحدة محجوزة مسبقًا (التي شُرحت آنفًا). هذا يساعد التطبيقات على تجنب زيادة مجمَّع المهملات (garbage allocation) عبر تقليل إنشاء نسخ <code>Buffer</code> جديدة وحجز أجزاء من الذاكرة بشكل فردي. يحسِّن ذلك الأداء واستخدام الذاكرة عبر تقليل الحاجة إلى تتبُّع وإزالة أقل قدر ممكن من الكائنات الموجودة والمتكررة.
 
مع ذلك، في حال احتاج المطور إلى الاحتفاظ يجزءٍ صغيرٍ من الذاكرة يقع في المجمع (pool) المحجوز مسبقًا لفترة زمنية غير معلومة، فيُستحسن إنشاء نسخة Buffer بحجز جزء آخر من الذاكر يقع خارج مجمع الذاكرة المحجوز مسبقًا (un-pooled) عبر استعمال Buffer.allocUnsafeSlow()‎ ثمَّ نسخ البيانات التي تريد الاحتفاظ بها.


مع ذلك، في حال احتاج المطور إلى الاحتفاظ يجزءٍ صغيرٍ من الذاكرة يقع في المجمع (pool) المحجوز مسبقًا لفترة زمنية غير معلومة، فيُستحسن إنشاء نسخة <code>Buffer</code> بحجز جزء آخر من الذاكر يقع خارج مجمع الذاكرة المحجوز مسبقًا (un-pooled) عبر استعمال <code>Buffer.allocUnsafeSlow()‎</code> ثمَّ نسخ البيانات التي تريد الاحتفاظ بها.<syntaxhighlight lang="javascript">
// الحاجة إلى الاحتفاظ ببعض أجزاء الذاكرة
// الحاجة إلى الاحتفاظ ببعض أجزاء الذاكرة
const store = [];
const store = [];


socket.on('readable', () => {
socket.on('readable', () => {
  const data = socket.read();


 const data = socket.read();
  // حجز جزء من الذاكرة خاص بالبيانات المراد الاحتفاظ بها
  const sb = Buffer.allocUnsafeSlow(10);


 // حجز جزء من الذاكرة خاص بالبيانات المراد الاحتفاظ بها
  // نسخ البيانات إلى موقع جديد
 
  data.copy(sb, 0, 0, 10);
 const sb = Buffer.allocUnsafeSlow(10);
 
 // نسخ البيانات إلى موقع جديد
 
 data.copy(sb, 0, 0, 10);
 
 store.push(sb);


  store.push(sb);
});
});
</syntaxhighlight>يجب عدم اللجوء إلى استعمال التابع <code>Buffer.allocUnsafeSlow()‎</code> إلا في نهاية المطاف بعد أن يلاحظ المطور نفسه أنه احتفظ بأجزاء من الذاكرة لا حاجة له فيها في تطبيقه.


يجب عدم اللجوء إلى استعمال التابع Buffer.allocUnsafeSlow()‎ إلا في نهاية المطاف بعد أن يلاحظ المطور نفسه أنه احتفظ بأجزاء من الذاكرة لا حاجة له فيها في تطبيقه.
سيرمى الخطأ <code>TypeError</code> إن لم يكن المعامل size عددًا.
 
===<code>Buffer.byteLength(string[, encoding])‎</code>===
سيرمى الخطأ TypeError إن لم يكن المعامل size عددًا.
{| class="wikitable mw-collapsible"
 
|+سجل التغييرات
=== التابع Buffer.byteLength(string[, encoding])‎ ===
!الإصدار
* string: ‏<string>‏ | <Buffer> | ‏<TypedArray> | ‏<DataView> | ‏<ArrayBuffer> | ‏<SharedArrayBuffer‏>‏ القيمة المراد حساب طولها (عدد بايتاتها).
!التغييرات
* encoding: <string> إن كان المعامل string سلسلة نصية، فسيمثَّل هذا المعامل الترميز الذي سيُستعمَل معها. القيمة الافتراضيَّة هي: 'utf8'.
* القيم المعادة: <integer> يعاد عدد بايتات المعامل string المعطى.
يعيد هذا التابع عدد البايتات الحقيقي للسلسلة النصية المُمرَّرة إليه. لا يشبه هذا التابع الخاصِّيَّة String.prototype.length التي تعيد عدد المحارف الموجودة في السلسلة النصية وليس عدد البايتات.
 
عند استعمال الترميز 'base64' والترميز 'hex'، يَفترض هذا التابع أنَّ جميع المدخلات صالحة. أمَّا عند إعطاء سلاسل نصية تحتوي على بيانات غير مرمَّزة بالترميز Base64 أو Hex (مثل المسافات البيضاء)، فقد تكون القيمة المعادة أكبر من طول النسخة Buffer المنشأة من تلك السلسلة حينذاك.
 
const str = '\u00bd + \u00bc = \u00be';
 
console.log(`${str}: ${str.length} characters, ` +
 
           `${Buffer.byteLength(str, 'utf8')} bytes`);
 
// ½ + ¼ = ¾: 9 characters, 12 bytes
 
عندما يكون المعامل string المعطى أحد الأنواع التالية: Buffer، أو DataView، أو TypedArray، أو ArrayBuffer، أو SharedArrayBuffe، فسيُعاد عدد البيانات الفعلي لهذا المعامل.
 
==== سجل التغييرات ====
{| class="wikitable"
|الإصدار
|التغييرات
|-
|-
|v7.0.0
|v7.0.0
سطر 474: سطر 423:
|-
|-
|v5.10.0
|v5.10.0
|يمكن أن يكون المعامل string أحد الكائنات TypedArray أو DataView أو ArrayBuffer.
|يمكن أن يكون المعامل <code>string</code> أحد الكائنات <code>TypedArray</code> أو <code>DataView</code> أو <code>ArrayBuffer</code>.
|-
|-
|v0.1.90
|v0.1.90
|أضيف هذا التابع.
|أضيف هذا التابع.
|}
|}
*<code>string</code>: ‏[[JavaScript/String|<string>]]‏‏ | <Buffer>‏ | ‏‏<TypedArray>‏ | ‏<DataView> | ‏<ArrayBuffer> | ‏<SharedArrayBuffer‏>‏ القيمة المراد حساب طولها (عدد بايتاتها).
*<code>encoding</code>: [[JavaScript/String|‏<string>]] إن كان المعامل <code>string</code> سلسلة نصية، فسيمثَّل هذا المعامل الترميز الذي سيُستعمَل معها. القيمة الافتراضيَّة هي: <code>'utf8'</code>.
*القيم المعادة: [[JavaScript/Number|<integer>]] يعاد عدد بايتات المعامل <code>string</code> المعطى.
يعيد هذا التابع عدد البايتات الحقيقي للسلسلة النصية المُمرَّرة إليه. لا يشبه هذا التابع الخاصِّيَّة <code>String.prototype.length</code> التي تعيد عدد المحارف الموجودة في السلسلة النصية وليس عدد البايتات.


=== التابع Buffer.compare(buf1, buf2)‎ ===
عند استعمال الترميز <code>'base64'</code> والترميز <code>'hex'</code>، يَفترض هذا التابع أنَّ جميع المدخلات صالحة. أمَّا عند إعطاء سلاسل نصية تحتوي على بيانات غير مرمَّزة بالترميز <code>Base64</code> أو <code>Hex</code> (مثل المسافات البيضاء)، فقد تكون القيمة المعادة أكبر من طول النسخة <code>Buffer</code> المنشأة من تلك السلسلة حينذاك.<syntaxhighlight lang="javascript">
* buf1: ‏<Buffer> | <Uint8Array> القيمة الأولى المراد موازتنها مع قيمة ثانية.
const str = '\u00bd + \u00bc = \u00be';
* buf1: ‏<Buffer> | <Uint8Array> القيمة الثانية المراد موازتنها مع القيمة الأولى.
يوازن هذا التابع بين المعاملين buf1 و buf2 المُمرَّرين إليه ثمَّ يعيد عددًا صحيحًا، إذ يستعمل عادةً بغرض ترتيب المصفوفات في النسخ Buffer. عمل هذا التابع مشابهٌ تمامًا للاستدعاء buf1.compare(buf2).


const buf1 = Buffer.from('1234');
console.log(`${str}: ${str.length} characters, ` +
 
            `${Buffer.byteLength(str, 'utf8')} bytes`);
const buf2 = Buffer.from('0123');
// ½ + ¼ = ¾: 9 characters, 12 bytes


</syntaxhighlight>عندما يكون المعامل <code>string</code> المعطى أحد الأنواع التالية: <code>Buffer</code>، أو <code>DataView</code>، أو <code>TypedArray</code>، أو <code>ArrayBuffer</code>، أو <code>SharedArrayBuffe</code>، فسيُعاد عدد البيانات الفعلي لهذا المعامل.
===<code>Buffer.compare(buf1, buf2)</code>===
{| class="wikitable mw-collapsible"
|+سجل التغييرات
!الإصدار
!التغييرات
|-
|v8.0.0
|أصبح بالإمكان استعمال الكائن <code>Uint8Array</code> مع المعاملين المُمرَّرين إلى التابع.
|-
|v0.11.13
|أضيف هذا التابع.
|}
*<code>buf1</code>: ‏<Buffer> | <Uint8Array> القيمة الأولى المراد موازتنها مع قيمة ثانية.
*<code>buf2</code>: ‏<Buffer> | <Uint8Array> القيمة الثانية المراد موازتنها مع القيمة الأولى.
يوازن هذا التابع بين المعاملين <code>buf1</code> و <code>buf2</code> المُمرَّرين إليه ثمَّ يعيد عددًا صحيحًا، إذ يستعمل عادةً بغرض ترتيب المصفوفات في النسخ <code>Buffer</code>. عمل هذا التابع مشابهٌ تمامًا للاستدعاء <code>buf1.compare(buf2)</code>.<syntaxhighlight lang="javascript">
const buf1 = Buffer.from('1234');
const buf2 = Buffer.from('0123');
const arr = [buf1, buf2];
const arr = [buf1, buf2];


console.log(arr.sort(Buffer.compare));
console.log(arr.sort(Buffer.compare));
// Prints: [ <Buffer 30 31 32 33>, <Buffer 31 32 33 34> ]
// Prints: [ <Buffer 30 31 32 33>, <Buffer 31 32 33 34> ]
// ([buf2, buf1] هذه النتيجة مساوية إلى)
// ([buf2, buf1] هذه النتيجة مساوية إلى)
 
</syntaxhighlight>
==== سجل التغييرات ====
===<code>Buffer.concat(list[, totalLength])‎</code>===
{| class="wikitable"
{| class="wikitable mw-collapsible"
|الإصدار
|+سجل التغييرات
|التغييرات
!الإصدار
!التغييرات
|-
|-
|v8.0.0
|v8.0.0
|أصبح بالإمكان استعمال الكائن Uint8Array مع المعاملين المُمرَّرين إلى التابع.
|أصبح بالإمكان استعمال الكائن <code>Uint8Array</code> مع المعامل <code>list</code> المُمرَّر إلى التابع.
|-
|-
|v0.11.13
|v0.7.11
|أضيف هذا التابع.
|أضيف هذا التابع.
|}
|}
*<code>list</code>: ‏<Buffer[]> | <Uint8Array> قائمةٌ من النسخ <code>Buffer</code> أو <code>Uint8Array</code> المراد دمجها مع بعضها بعضًا.
*<code>totalLength</code>:‏ [[JavaScript/Number|<integer>]] الطول الكلي للنسخ <code>Buffer</code> أو <code>Uint8Array</code> المراد دمجها.
يدمج هذا التابع جميع النسخ <code>Buffer</code> أو <code>Uint8Array</code> المُحدَّدة في المعامل list مع بعضها بعضها ووفقًا للطول <code>totalLength</code> المعطى ثمَّ ينشئ نسخة <code>Buffer</code> جديدة يضع الناتج فيها ويعيدها.


=== التابع Buffer.concat(list[, totalLength])‎ ===
إن لم يحوي المعامل <code>list</code> أيَّ عنصر أو كانت قيمة المعامل <code>totalLength</code> المعطاة 0، فستعاد نسخة <code>Buffer</code> جديدة بطول 0.
* list: ‏<Buffer[]> | <Uint8Array[]> قائمةٌ من النسخ Buffer أو Uint8Array المراد دمجها مع بعضها بعضًا.
* totalLength:‏ <integer> الطول الكلي للنسخ Buffer أو Uint8Array المراد دمجها.
يدمج هذا التابع جميع النسخ Buffer أو Uint8Array المُحدَّدة في المعامل list مع بعضها بعضها ووفقًا للطول totalLength المعطى ثمَّ ينشئ نسخة Buffer جديدة يضع الناتج فيها ويعيدها.
 
إن لم يحوي المعامل list أيَّ عنصر أو كانت قيمة المعامل totalLength المعطاة 0، فستعاد نسخة Buffer جديدة بطول 0.
 
إن لم يعطَ المعامل totalLength، فسيحسب من النسخ Buffer الموجودة في المعامل list. هذا الأمر سيُقلِّل من الأداء، إذ ستزيد العمليات المنفَّذة لحساب الطول الكلي totalLength المراد دمجه. بناءً على ذلك، يُفضَّل حساب قيمة totalLength ثمَّ تمريرها إلى التابع إن كان بالإمكان.


إن أعطيت قيمة المعامل totalLength، فسيُحوَّل إلى عدد صحيح عديم الإشارة (unsigned integer). إن زاد طول النُسَخ المعطاة في المعامل list المراد دمجها عن القيمة totalLength المعطاة، فستُقتَطَع نتيجة دمج جميع تلك النسخ لتصبح مساوية للطول totalLength.
إن لم يعطَ المعامل <code>totalLength</code>، فسيحسب من النسخ <code>Buffer</code> الموجودة في المعامل <code>list</code>. هذا الأمر سيُقلِّل من الأداء، إذ ستزيد العمليات المنفَّذة لحساب الطول الكلي <code>totalLength</code> المراد دمجه. بناءً على ذلك، يُفضَّل حساب قيمة <code>totalLength</code> ثمَّ تمريرها إلى التابع إن كان بالإمكان.


إن أعطيت قيمة المعامل <code>totalLength</code>، فسيُحوَّل إلى عدد صحيح عديم الإشارة (unsigned integer). إن زاد طول النُسَخ المعطاة في المعامل <code>list</code> المراد دمجها عن القيمة <code>totalLength</code> المعطاة، فستُقتَطَع نتيجة دمج جميع تلك النسخ لتصبح مساوية للطول <code>totalLength</code>.<syntaxhighlight lang="javascript">
// في نسخة واحدة Buffer دمج ثلاث نسخٍ من
// في نسخة واحدة Buffer دمج ثلاث نسخٍ من


const buf1 = Buffer.alloc(10);
const buf1 = Buffer.alloc(10);
const buf2 = Buffer.alloc(14);
const buf2 = Buffer.alloc(14);
const buf3 = Buffer.alloc(18);
const buf3 = Buffer.alloc(18);
const totalLength = buf1.length + buf2.length + buf3.length;
const totalLength = buf1.length + buf2.length + buf3.length;


console.log(totalLength);
console.log(totalLength);
// 42 :سيُطبع
// 42 :سيُطبع


سطر 537: سطر 498:


console.log(bufA);
console.log(bufA);
// <Buffer 00 00 00 00 ...> :سيُطبع
// <Buffer 00 00 00 00 ...> :سيُطبع
console.log(bufA.length);
console.log(bufA.length);
// 42 :سيُطبع
// 42 :سيُطبع
 
</syntaxhighlight>
==== سجل التغييرات ====
===<code>Buffer.from(array)‎</code>===
{| class="wikitable"
|الإصدار
|التغييرات
|-
|v8.0.0
|أصبح بالإمكان استعمال الكائن Uint8Array مع المعامل list المُمرَّر إلى التابع.
|-
|v0.7.11
|أضيف هذا التابع.
|}
 
=== التابع Buffer.from(array)‎ ===
أضيف في الإصدار v5.10.0.
أضيف في الإصدار v5.10.0.
* array: ‏<integer[]‎> مصفوفةٌ من البايتات المراد نسخها.
*<code>array</code>: ‏[[JavaScript/Number|<integer[]‎>]] مصفوفةٌ من البايتات المراد نسخها.
تنشئ هذه الدالة نسخة Buffer جديدة وتحجز جزءًا من ذاكرة التخزين المؤقت تضع فيه نسخةً من محتويات المعامل array.
تنشئ هذه الدالة نسخة <code>Buffer</code> جديدة وتحجز جزءًا من ذاكرة التخزين المؤقت تضع فيه نسخةً من محتويات المعامل <code>array</code>.<syntaxhighlight lang="javascript">
 
// UTF-8 بعد ترميزها باستعمال 'buffer' جديدة تحتوي على محارف السلسلة النصية Buffer إنشاء نسخة
// UTF-8 بعد ترميزها باستعمال 'buffer' جديدة تحتوي على محارف السلسلة النصية Buffer إنشاء نسخة
const buf = Buffer.from([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);
const buf = Buffer.from([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);
 
</syntaxhighlight>سيرمى الخطأ <code>TypeError</code> إن لم يكن المعامل <code>array</code> مصفوفةً.
سيرمى الخطأ TypeError إن لم يكن المعامل array مصفوفةً.
===<code>Buffer.from(arrayBuffer[, byteOffset[, length]])‎</code>===
 
=== التابع Buffer.from(arrayBuffer[, byteOffset[, length]])‎ ===
أضيف في الإصدار v5.10.0.
أضيف في الإصدار v5.10.0.
* arrayBuffer: ‏<ArrayBuffer> | <SharedArrayBuffer> كائنٌ من النوع ArrayBuffer أو من النوع SharedArrayBuffer أو الخاصِّيَّة ‎.buffer للكائن TypedBuffer.
*<code>arrayBuffer</code>: ‏<ArrayBuffer> | <SharedArrayBuffer> كائنٌ من النوع <code>ArrayBuffer</code> أو من النوع <code>SharedArrayBuffer</code> أو الخاصِّيَّة ‎<code>.buffer</code> للكائن <code>TypedBuffer</code>.
* byteOffset: ‏<integer> فهرس البايت الأول الذي سيبدأ عنده مشاركة جزءٍ من الذاكرة. القيمة الافتراضيَّة هي: 0.
*<code>byteOffset</code>: ‏[[JavaScript/Number|<integer>]] فهرس البايت الأول الذي سيبدأ عنده مشاركة جزءٍ من الذاكرة. القيمة الافتراضيَّة هي: 0.
* length: ‏<integer> عدد بايتات الذاكرة المراد مشاركتها. القيمة الافتراضيَّة هي: arrayBuffer.length - byteOffset.
*<code>length</code>: ‏[[JavaScript/Number|<integer>]] عدد بايتات الذاكرة المراد مشاركتها. القيمة الافتراضيَّة هي: <code>arrayBuffer.length - byteOffset</code>.
تنشئ هذه الدالة نسخة Buffer جديدة وتتشارك جزء الذاكرة الخاص بالكائن ArrayBuffer أو SharedArrayBuffer دون نسخ ما تحتويها. عندما نُمرِّر مثلًا مرجعًا للخاصِّيَّة ‎.buffer في النسخة TypedArray، ستتشارك النسخة Buffer الجديدة المنشأة آنذاك مع نفس الذاكرة المحجوزة من طرف TypedArray.
تنشئ هذه الدالة نسخة <code>Buffer</code> جديدة وتتشارك جزء الذاكرة الخاص بالكائن <code>ArrayBuffer</code> أو <code>SharedArrayBuffer</code> دون نسخ ما تحتويها. عندما نُمرِّر مثلًا مرجعًا للخاصِّيَّة ‎<code>.buffer</code> في النسخة <code>TypedArray</code>، ستتشارك النسخة <code>Buffer</code> الجديدة المنشأة آنذاك مع نفس الذاكرة المحجوزة من طرف <code>TypedArray</code>.<syntaxhighlight lang="javascript">
 
const arr = new Uint16Array(2);
const arr = new Uint16Array(2);


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


// `arr` مشاركة الذاكرة مع
// `arr` مشاركة الذاكرة مع
const buf = Buffer.from(arr.buffer);
const buf = Buffer.from(arr.buffer);


console.log(buf);
console.log(buf);
// <Buffer 88 13 a0 0f> :سيُطبع
// <Buffer 88 13 a0 0f> :سيُطبع


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


console.log(buf);
console.log(buf);
// <Buffer 88 13 70 17> :سيُطبع
// <Buffer 88 13 70 17> :سيُطبع
 
</syntaxhighlight>إن مُرِّر المعاملان <code>byteOffset</code> و <code>length</code> الاختياريان، فسيُحدِّدان مجالًا من الذاكرة ضمن <code>arrayBuffer</code> تريد النسخة <code>Buffer</code> مشاركته فقط.<syntaxhighlight lang="javascript">
إن مُرِّر المعاملان byteOffset و length الاختياريان، فسيُحدِّدان مجالًا من الذاكرة ضمن arrayBuffer تريد النسخة Buffer مشاركته فقط.
const ab = new ArrayBuffer(10);
 
const buf = Buffer.from(ab, 0, 2);
const ab = new ArrayBuffer(10);
 
const buf = Buffer.from(ab, 0, 2);


console.log(buf.length);
console.log(buf.length);
// 2 :سيُطبع
// 2 :سيُطبع
 
</syntaxhighlight>سيرمى الخطأ <code>TypeError</code> إن لم يكن المعامل <code>arrayBuffer</code> كائنًا من النوع <code>ArrayBuffer</code> أو  <code>SharedArrayBuffer</code>.
سيرمى الخطأ TypeError إن لم يكن المعامل arrayBuffer كائنًا من النوع ArrayBuffer أو  SharedArrayBuffer.
===<code>Buffer.from(buffer)‎</code>===
 
=== الصنف Buffer.from(buffer)‎ ===
أضيف في الإصدار v5.10.0.
أضيف في الإصدار v5.10.0.
 
*<code>buffer</code>: ‏<Buffer> | <Uint8Array> نسخةٌ من <code>Buffer</code> أو <code>Unit8Array</code> يراد نسخ البيانات منها.
==== المعاملات ====
تنشئ هذه الدالة نسخة <code>Buffer</code> جديدة وتضع فيها نسخةً من محتوى المعامل <code>buffer</code> المعطى.<syntaxhighlight lang="javascript">
* buffer: ‏<Buffer> | <Uint8Array> نسخةٌ من Buffer أو Unit8Array يراد نسخ البيانات منها.
تنشئ هذه الدالة نسخة Buffer جديدة وتضع فيها نسخةً من محتوى المعامل buffer المعطى.
 
const buf1 = Buffer.from('buffer');
const buf1 = Buffer.from('buffer');
const buf2 = Buffer.from(buf1);
const buf2 = Buffer.from(buf1);


سطر 622: سطر 548:


console.log(buf1.toString());
console.log(buf1.toString());
// auffer :سيُطبع
// auffer :سيُطبع
console.log(buf2.toString());
console.log(buf2.toString());
// buffer :سيُطبع
// buffer :سيُطبع
 
</syntaxhighlight>سيرمى الخطأ <code>TypeError</code> إن لم يكن المعامل <code>buffer</code> نسخةً من <code>Buffer</code> أو <code>Uint8Array</code> يراد نسخ البيانات منها.
سيرمى الخطأ TypeError إن لم يكن المعامل buffer نسخةً من Buffer أو Uint8Array يراد نسخ البيانات منها.
===<code>Buffer.from(string[, encoding])‎</code>===
 
=== التابع Buffer.from(string[, encoding])‎ ===
أضيف في الإصدار v5.10.0.
أضيف في الإصدار v5.10.0.
* string: ‏<string> السلسلة النصية المراد ترميزها ووضعها في النسخة Buffer المنشأة.
*<code>string</code>: [[JavaScript/String|‏<string>]] السلسلة النصية المراد ترميزها ووضعها في النسخة <code>Buffer</code> المنشأة.
* encoding: ‏<string> الترميز المراد استعماله مع السلسلة النصية string المعطاة. القيمة الافتراضيَّة هي: 'utf8'.
*<code>encoding</code>: ‏[[JavaScript/String|‏<string>]] الترميز المراد استعماله مع السلسلة النصية <code>string</code> المعطاة. القيمة الافتراضيَّة هي: <code>'utf8'</code>.
تنشئ هذه الدالة نسخة Buffer جديدة وتضع فيها السلسلة النصية string المعطاة بعد ترميزها باستعمال الترميز المحدَّد في المعامل encoding.
تنشئ هذه الدالة نسخة <code>Buffer</code> جديدة وتضع فيها السلسلة النصية <code>string</code> المعطاة بعد ترميزها باستعمال الترميز المحدَّد في المعامل <code>encoding</code>.<syntaxhighlight lang="javascript">
 
const buf1 = Buffer.from('this is a tést');
const buf1 = Buffer.from('this is a tést');
const buf2 = Buffer.from('7468697320697320612074c3a97374', 'hex');
const buf2 = Buffer.from('7468697320697320612074c3a97374', 'hex');


console.log(buf1.toString());
console.log(buf1.toString());
// this is a tést :سيُطبع
// this is a tést :سيُطبع
console.log(buf2.toString());
console.log(buf2.toString());
// this is a tést :سيُطبع
// this is a tést :سيُطبع
console.log(buf1.toString('ascii'));
console.log(buf1.toString('ascii'));
// this is a tC)st :سيُطبع
// this is a tC)st :سيُطبع
 
</syntaxhighlight>سيرمى الخطأ <code>TypeError</code> إن لم يكن المعامل <code>string</code> سلسلة نصية.
سيرمى الخطأ TypeError إن لم يكن المعامل string سلسلة نصية.
===<code>Buffer.from(object[, offsetOrEncoding[, length]])‎</code>===
 
=== التابع Buffer.from(object[, offsetOrEncoding[, length]])‎ ===
أضيف في الإصدار v8.2.0.
أضيف في الإصدار v8.2.0.
* object: ‏<Object> كائنٌ يدعم Symbol.toPrimitive أو valueOf()‎.
*<code>object</code>: ‏[[JavaScript/Object|<Object>]] كائنٌ يدعم <code>Symbol.toPrimitive</code> أو <code>valueOf()‎</code>.
* offsetOrEncoding: ‏<number> | <string> عدد البايتات التي تمثِّل مقدار الإزاحة أو قيمةٌ تمثِّل الترميز المراد استعماله وهذا يعتمد على القيمة التي يعيدها إمَّا object.valueOf()‎ أو object[Symbol.toPrimitive]()‎.
*<code>offsetOrEncoding</code>: ‏[[JavaScript/Number|<number>]] | ‏[[JavaScript/String|<string>]] عدد البايتات التي تمثِّل مقدار الإزاحة أو قيمةٌ تمثِّل الترميز المراد استعماله وهذا يعتمد على القيمة التي يعيدها إمَّا <code>object.valueOf()‎</code> أو <code>object[Symbol.toPrimitive]()</code>‎.
* length: ‏<number> عدد البايتات المراد نسخها وتعتمد على القيمة التي يعيدها إمَّا object.valueOf()‎ أو object[Symbol.toPrimitive]()‎.
*<code>length</code>: ‏[[JavaScript/Number|<number>]] عدد البايتات المراد نسخها وتعتمد على القيمة التي يعيدها إمَّا <code>object.valueOf()‎</code> أو <code>object[Symbol.toPrimitive]()</code>‎.
تستعمل هذه الدالة بالشكل Buffer.from(object.valueOf(), offsetOrEncoding, length)‎ من أجل الكائنات التي تعيد الدالة valueOf()‎ معها قيمةً لا تتساوى بشكل صارم مع قيمة المعامل object.
تستعمل هذه الدالة بالشكل <code>Buffer.from(object.valueOf(), offsetOrEncoding, length)‎</code> من أجل الكائنات التي تعيد الدالة <code>valueOf()‎</code> معها قيمةً لا تتساوى بشكل صارم مع قيمة المعامل <code>object</code>.<syntaxhighlight lang="javascript">
 
const buf = Buffer.from(new String('this is a test'));
const buf = Buffer.from(new String('this is a test'));
// <Buffer 74 68 69 73 20 69 73 20 61 20 74 65 73 74>
// <Buffer 74 68 69 73 20 69 73 20 61 20 74 65 73 74>
 
</syntaxhighlight>بينما تستعمل بالشكل <code>Buffer.from(object[Symbol.toPrimitive](), offsetOrEncoding, length)‎</code> من أجل الكائنات التي تدعم <code>Symbol.toPrimitive</code>.<syntaxhighlight lang="javascript">
بينما تستعمل بالشكل Buffer.from(object[Symbol.toPrimitive](), offsetOrEncoding, length)‎ من أجل الكائنات التي تدعم Symbol.toPrimitive.
 
class Foo {
class Foo {
 
  [Symbol.toPrimitive]() {
 [Symbol.toPrimitive]() {
    return 'this is a test';
 
  }
   return 'this is a test';
 
 }
 
}
}


const buf = Buffer.from(new Foo(), 'utf8');
const buf = Buffer.from(new Foo(), 'utf8');
// <Buffer 74 68 69 73 20 69 73 20 61 20 74 65 73 74>
// <Buffer 74 68 69 73 20 69 73 20 61 20 74 65 73 74>
 
</syntaxhighlight>
=== التابع Buffer.isBuffer(obj)===
===<code>Buffer.isBuffer(obj)</code>===
أضيف في الإصدار v0.1.101.
أضيف في الإصدار v0.1.101.
* obj: ‏<Object> الكائن المراد التحقُّق منه إن كان من النوع Buffer أم لا.
*<code>obj</code>: ‏[[JavaScript/Object|<Object>]] الكائن المراد التحقُّق منه إن كان من النوع <code>Buffer</code> أم لا.
تعيد هذه الدالة القيمة المنطقيَّة true إن كان الكائن obj المعطى من النوع Buffer، والقيمة المنطقيَّة false إن لم يكن.
تعيد هذه الدالة القيمة المنطقيَّة <code>true</code> إن كان الكائن <code>obj</code> المعطى من النوع <code>Buffer</code>، والقيمة المنطقيَّة <code>false</code> إن لم يكن.
 
===<code>Buffer.isEncoding(encoding)‎</code>===
=== التابع Buffer.isEncoding(encoding)‎ ===
أضيف في الإصدار v0.9.1.
أضيف في الإصدار v0.9.1.
* encoding: ‏<string> اسم الترميز المراد التحقُّق منه.
*<code>encoding</code>: ‏[[JavaScript/String|<string>]] اسم الترميز المراد التحقُّق منه.
يعيد هذا التابع القيمة المنطقيَّة true إن كان الترميز encoding المعطى مدعومًا، أو القيمة المنطقيَّة false إن لم يكن.
يعيد هذا التابع القيمة المنطقيَّة <code>true</code> إن كان الترميز <code>encoding</code> المعطى مدعومًا، أو القيمة المنطقيَّة <code>false</code> إن لم يكن.
 
===الخاصية <code>Buffer.poolSize</code>===
=== الخاصية Buffer.poolSize ===
أضيفت في الإصدار v0.11.3.
أضيفت في الإصدار v0.11.3.


تمثِّل هذه الخاصِّيَّة حجم الذاكرة المحجوزة مسبقًا (بالبايت) للنسخ Buffer الداخلية التي تُستعمَل كمُجمِّع (pooling). قيمتها الافتراضيَّة هي 8192، ويمكن تعديلها.
تمثِّل هذه الخاصِّيَّة حجم الذاكرة المحجوزة مسبقًا (بالبايت) للنسخ <code>Buffer</code> الداخلية التي تُستعمَل كمُجمِّع (pooling). قيمتها الافتراضيَّة هي 8192، ويمكن تعديلها.
 
===<code>buf[Index]‎</code>===
=== buf[Index]‎ ===
يمكن استعمال معامل الفهرسة [index] لجلب أو تعيين قيمة بايت واحد موجود في الموقع <code>index</code> ضمن <code>buf</code>. بما أنَّ كل قيمة تمثِّل بايتًا واحدًا، فيجب أن تقع بين المجال 0x00 و 0xFF بالنظام الست عشري أو بين 0 و 255 بالنظام العشري.
يمكن استعمال معامل الفهرسة [index] لجلب أو تعيين قيمة بايت واحد موجود في الموقع index ضمن buf. بما أنَّ كل قيمة تمثِّل بايتًا واحدًا، فيجب أن تقع بين المجال 0x00 و 0xFF بالنظام الست عشري أو بين 0 و 255 بالنظام العشري.
 
إنَّ معامل الفهرسة هذا موروثٌ من Uint8Array، لذا سلوكه مماثل تمامًا للسلوك الذي يسلكه في Uint8Array. هذا يعني أنَّ محاولة الوصول إلى قيمة تقع خارج الحدود يعيد القيمة undefined، ومحاولة ضبط تلك القيمة ليس له أي تأثير.


إنَّ معامل الفهرسة هذا موروثٌ من <code>Uint8Array</code>، لذا سلوكه مماثل تمامًا للسلوك الذي يسلكه في <code>Uint8Array</code>. هذا يعني أنَّ محاولة الوصول إلى قيمة تقع خارج الحدود يعيد القيمة <code>[[JavaScript/undefined|undefined]]</code>، ومحاولة ضبط تلك القيمة ليس له أي تأثير.<syntaxhighlight lang="javascript">
// بايتًا واحدًا في كل مرة Buffer إلى ASCII نسخ سلسلة نصية بترميز
// بايتًا واحدًا في كل مرة Buffer إلى ASCII نسخ سلسلة نصية بترميز


const str = 'Node.js';
const str = 'Node.js';
const buf = Buffer.allocUnsafe(str.length);
const buf = Buffer.allocUnsafe(str.length);


for (let i = 0; i < str.length; i++) {
for (let i = 0; i < str.length; i++) {
 
  buf[i] = str.charCodeAt(i);
 buf[i] = str.charCodeAt(i);
 
}
}


console.log(buf.toString('ascii'));
console.log(buf.toString('ascii'));
// Node.js :سيُطبع
// Node.js :سيُطبع
 
</syntaxhighlight>
=== الخاصية buf.buffer ===
===الخاصية <code>buf.buffer</code>===
تعيد الكائن ArrayBuffer بناءً على النوع الذي أنشئ الكائن Buffer منه.
تعيد الكائن <code>ArrayBuffer</code> بناءً على النوع الذي أنشئ الكائن <code>Buffer</code> منه.<syntaxhighlight lang="javascript">
 
const arrayBuffer = new ArrayBuffer(16);
const arrayBuffer = new ArrayBuffer(16);
const buffer = Buffer.from(arrayBuffer);
const buffer = Buffer.from(arrayBuffer);


console.log(buffer.buffer === arrayBuffer);
console.log(buffer.buffer === arrayBuffer);
// true :سيُطبع
// true :سيُطبع
 
</syntaxhighlight>
=== التابع buf.compare(target[, targetStart[, targetEnd[, sourceStart[, sourceEnd]]]])‎ ===
===<code>buf.compare(target[, targetStart[, targetEnd[, sourceStart[, sourceEnd]]]])‎</code>===
* target:‏ <Buffer> | <Uint8Array>  كائنٌ من النوع Buffer أو Uint8Array المراد موازنة buf معه.
{| class="wikitable mw-collapsible"
* targetStart: ‏<integer> قيمة الإزاحة من بداية الكائن target التي ستبدأ عندها عمليَّة الموازنة. القيمة الافتراضيَّة هي: 0.
|+سجل التغييرات
* targetEnd: ‏<integer> قيمة الإزاحة من نهاية الكائن target التي ستنتهي عندها عمليَّة الموازنة (لا تدخل هذه القيمة ضمن المجال). القيمة الافتراضيَّة هي: target.length.
!الإصدار
* sourceStart: ‏<integer> قيمة الإزاحة ضمن buf من بدايته التي ستبدأ عندها عمليَّة الموازنة. القيمة الافتراضيَّة هي: 0.
!التغييرات
* sourceEnd: ‏<integer> قيمة الإزاحة ضمن buf من نهايته التي ستنتهي عندها عمليَّة الموازنة (لا تدخل هذه القيمة ضمن المجال). القيمة الافتراضيَّة هي: buf.length.
|-
يوازن هذا التابع بين buf و target ثمَّ يعيد عددًا يحدِّد إن كان buf يأتي قبل Buffer أو بعده أو كان مماثلًا له من ناحية الترتيب. تعتمد عمليَّة الموازنة على سلسلة البايتات الفعليَّة في Buffer. يعيد هذا التابع العدد:
|v8.0.0
* 0 إن كان target و buf متماثلان، أو
|أصبح بالإمكان استعمال الكائن <code>Uint8Array</code> مع المعامل <code>target</code> المُمرَّر إلى التابع.
* 1 إن كان من المفترض أن يأتي target قبل buf عند ترتيبهما، أو
|-
* ‎-1 إن كان من المفترض أن يأتي target بعد but عند ترتيبهما.
|v5.11.0
|أضيفت معاملات جديدة لتحديد مجال معين يراد موازنته فقط.
|-
|v0.11.13
|أضيف هذا التابع.
|}
*<code>target</code>:‏ <Buffer> | <Uint8Array>  كائنٌ من النوع <code>Buffer</code> أو <code>Uint8Array</code> المراد موازنة buf معه.
*<code>targetStart</code>: ‏[[JavaScript/Number|<integer>]] قيمة الإزاحة من بداية الكائن <code>target</code> التي ستبدأ عندها عمليَّة الموازنة. القيمة الافتراضيَّة هي: 0.
*<code>targetEnd</code>: ‏[[JavaScript/Number|<integer>]] قيمة الإزاحة من نهاية الكائن <code>target</code> التي ستنتهي عندها عمليَّة الموازنة (لا تدخل هذه القيمة ضمن المجال). القيمة الافتراضيَّة هي: <code>target.length</code>.
*<code>sourceStart</code>: ‏[[JavaScript/Number|<integer>]] قيمة الإزاحة ضمن <code>buf</code> من بدايته التي ستبدأ عندها عمليَّة الموازنة. القيمة الافتراضيَّة هي: 0.
*<code>sourceEnd</code>: ‏[[JavaScript/Number|<integer>]] قيمة الإزاحة ضمن <code>buf</code> من نهايته التي ستنتهي عندها عمليَّة الموازنة (لا تدخل هذه القيمة ضمن المجال). القيمة الافتراضيَّة هي: <code>buf.length</code>.
يوازن هذا التابع بين <code>buf</code> و <code>target</code> ثمَّ يعيد عددًا يحدِّد إن كان <code>buf</code> يأتي قبل <code>Buffer</code> أو بعده أو كان مماثلًا له من ناحية الترتيب. تعتمد عمليَّة الموازنة على سلسلة البايتات الفعليَّة في <code>Buffer</code>. يعيد هذا التابع العدد:
*0 إن كان <code>target</code> و <code>buf</code> متماثلان، أو
*1 إن كان من المفترض أن يأتي <code>target</code> قبل <code>buf</code> عند ترتيبهما، أو
*‎-1 إن كان من المفترض أن يأتي <code>target</code> بعد <code>but</code> عند ترتيبهما.
<syntaxhighlight lang="javascript">
const buf1 = Buffer.from('ABC');
const buf1 = Buffer.from('ABC');
const buf2 = Buffer.from('BCD');
const buf2 = Buffer.from('BCD');
const buf3 = Buffer.from('ABCD');
const buf3 = Buffer.from('ABCD');


console.log(buf1.compare(buf1));
console.log(buf1.compare(buf1));
// 0
// 0
console.log(buf1.compare(buf2));
console.log(buf1.compare(buf2));
// -1
// -1
console.log(buf1.compare(buf3));
console.log(buf1.compare(buf3));
// -1
// -1
console.log(buf2.compare(buf1));
console.log(buf2.compare(buf1));
// 1
// 1
console.log(buf2.compare(buf3));
console.log(buf2.compare(buf3));
// 1
// 1
console.log([buf1, buf2, buf3].sort(Buffer.compare));
console.log([buf1, buf2, buf3].sort(Buffer.compare));
// [ <Buffer 41 42 43>, <Buffer 41 42 43 44>, <Buffer 42 43 44> ]
// [ <Buffer 41 42 43>, <Buffer 41 42 43 44>, <Buffer 42 43 44> ]
// ([buf1, buf3, buf2] هذه النتيجة مساوية إلى)
// ([buf1, buf3, buf2] هذه النتيجة مساوية إلى)
 
</syntaxhighlight>يمكن استعمال المعاملات <code>targetStart</code>، و <code>targetEnd</code>، و <code>sourceStart</code>، و <code>sourceEnd</code> الاختياريَّة لتقليص المجال المراد موازنته إلى مجال محدَّد ضمن <code>target</code> و <code>buf</code>.<syntaxhighlight lang="javascript">
يمكن استعمال المعاملات targetStart، و targetEnd، و sourceStart، و sourceEnd الاختياريَّة لتقليص المجال المراد موازنته إلى مجال محدَّد ضمن target و buf.
const buf1 = Buffer.from([1, 2, 3, 4, 5, 6, 7, 8, 9]);
 
const buf1 = Buffer.from([1, 2, 3, 4, 5, 6, 7, 8, 9]);
 
const buf2 = Buffer.from([5, 6, 7, 8, 9, 1, 2, 3, 4]);
const buf2 = Buffer.from([5, 6, 7, 8, 9, 1, 2, 3, 4]);


console.log(buf1.compare(buf2, 5, 9, 0, 4));
console.log(buf1.compare(buf2, 5, 9, 0, 4));
// 0
// 0
console.log(buf1.compare(buf2, 0, 6, 4));
console.log(buf1.compare(buf2, 0, 6, 4));
// -1
// -1
console.log(buf1.compare(buf2, 5, 6, 5));
console.log(buf1.compare(buf2, 5, 6, 5));
// 1
// 1
 
</syntaxhighlight>سيرمى الخطأ <code>ERR_INDEX_OUT_OF_RANGE</code> إن كان <code>targetStart < 0</code>، أو <code>sourceStart < 0</code>، أو <code>targetEnd > target.byteLength</code>، أو <code>sourceEnd > source.byteLength</code>.
سيرمى الخطأ ERR_INDEX_OUT_OF_RANGE إن كان targetStart < أو sourceStart < أو targetEnd > target.byteLength، أو sourceEnd > source.byteLength.
===<code>buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])‎</code>===
 
==== سجل التغييرات ====
{| class="wikitable"
|الإصدار
|التغييرات
|-
|v8.0.0
|أصبح بالإمكان استعمال الكائن Uint8Array مع المعامل target المُمرَّر إلى التابع.
|-
|v5.11.0
|أضيفت معاملات جديدة لتحديد مجال معين يراد موازنته فقط.
|-
|v0.11.13
|أضيف هذا التابع.
|}
 
=== التابع buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])‎ ===
أضيف في الإصدار v0.1.90.
أضيف في الإصدار v0.1.90.
* target: ‏<Buffer> | <Uint8Array> كائنٌ من النوع Buffer أو Uint8Array المراد لصق البيانات المنسوخة فيه.
*<code>target</code>: ‏<Buffer> | <Uint8Array> كائنٌ من النوع <code>Buffer</code> أو <code>Uint8Array</code> المراد لصق البيانات المنسوخة فيه.
* targetStart: ‏<integer> قيمة الإزاحة من بداية الكائن target التي ستبدأ عندها عمليَّة الكتابة (اللصق). القيمة الافتراضيَّة هي: 0.
*<code>targetStart</code>: ‏[[JavaScript/Number|<integer>]] قيمة الإزاحة من بداية الكائن <code>target</code> التي ستبدأ عندها عمليَّة الكتابة (اللصق). القيمة الافتراضيَّة هي: 0.
* sourceStart: ‏<integer> قيمة الإزاحة ضمن buf من بدايته التي ستبدأ عندها عملية النسخ. القيمة الافتراضيَّة هي: 0.
*<code>sourceStart</code>: ‏[[JavaScript/Number|<integer>]] قيمة الإزاحة ضمن <code>buf</code> من بدايته التي ستبدأ عندها عملية النسخ. القيمة الافتراضيَّة هي: 0.
* sourceEnd: ‏<integer> قيمة الإزاحة ضمن buf من نهايته التي ستتوقف عندها عمليَّة النسخ. القيمة الافتراضيَّة هي: buf.length.
*<code>sourceEnd</code>: ‏[[JavaScript/Number|<integer>]] قيمة الإزاحة ضمن <code>buf</code> من نهايته التي ستتوقف عندها عمليَّة النسخ. القيمة الافتراضيَّة هي: <code>buf.length</code>.
ينسخ هذا التابع بيانات من مجال محدَّد من buf ويلصقها ضمن مجال محدَّد في atrget حتى لو كان مجال الذاكرة المحجوز للكائن target المعطى يتداخل مع buf.
ينسخ هذا التابع بيانات من مجال محدَّد من <code>buf</code> ويلصقها ضمن مجال محدَّد في <code>atrget</code> حتى لو كان مجال الذاكرة المحجوز للكائن <code>target</code> المعطى يتداخل مع <code>buf</code>.<syntaxhighlight lang="javascript" line="1">
 
// `Buffer` إنشاء نسختين من
// `Buffer` إنشاء نسختين من
const buf1 = Buffer.allocUnsafe(26);
const buf1 = Buffer.allocUnsafe(26);
const buf2 = Buffer.allocUnsafe(26).fill('!');
const buf2 = Buffer.allocUnsafe(26).fill('!');


for (let i = 0; i < 26; i++) {
for (let i = 0; i < 26; i++) {
  // ASCII قيمة المحرف في الجدول 'a' العدد 97 هو
  buf1[i] = i + 97;
}


 // ASCII قيمة المحرف في الجدول 'a' العدد 97 هو
// بدءًا من البايت 8 `buf2` من 16 إلى 19 ولصقها ضمن `buf1` نسخ بايتات
 
 buf1[i] = i + 97;
 
}
 
// بدءًا من البايت 8 `buf2` من 16 إلى 19 ولصقها ضمن `buf1` نسخ بايتات
 
buf1.copy(buf2, 8, 16, 20);
buf1.copy(buf2, 8, 16, 20);


console.log(buf2.toString('ascii', 0, 25));
console.log(buf2.toString('ascii', 0, 25));
// !!!!!!!!qrst!!!!!!!!!!!!! :سيُطبع
// !!!!!!!!qrst!!!!!!!!!!!!! :سيُطبع
 
</syntaxhighlight>
<nowiki>-------</nowiki>
===<code>buf.entries()‎</code>===
 
// جديدة ثمَّ نسخ بيانات من مجال ما منها ولصقها ضمن منطقة `Buffer` إنشاء نسخة
 
// نفسها `Buffer` متداخلة من الذاكرة ضمن
 
const buf = Buffer.allocUnsafe(26);
 
for (let i = 0; i < 26; i++) {
 
 // ASCII قيمة المحرف في الجدول 'a' العدد 97 هو
 
 buf[i] = i + 97;
 
}
 
buf.copy(buf, 0, 4, 10);
 
console.log(buf.toString());
 
// efghijghijklmnopqrstuvwxyz :سيُطبع
 
=== التابع buf.entries()‎ ===
أضيف في الإصدار v1.1.0.
أضيف في الإصدار v1.1.0.


ينشئ هذا التابع مُكرِّرًا (iterator) للأزواج [index, byte] من محتويات الكائن buf ثمَّ يعيده.
ينشئ هذا التابع مُكرِّرًا (iterator) للأزواج <code>[index, byte]</code> من محتويات الكائن <code>buf</code> ثمَّ يعيده.<syntaxhighlight lang="javascript">
 
// `Buffer` إظهار كامل محتوى
// `Buffer` إظهار كامل محتوى


سطر 868: سطر 705:


for (const pair of buf.entries()) {
for (const pair of buf.entries()) {
 
  console.log(pair);
 console.log(pair);
 
}
}
// :سيُطبع
// :سيُطبع
 
//   [0, 98]
//   [0, 98]
//   [1, 117]
 
//   [2, 102]
//   [1, 117]
//   [3, 102]
 
//   [4, 101]
//   [2, 102]
//   [5, 114]
 
</syntaxhighlight>
//   [3, 102]
===<code>buf.equals(otherBuffer)‎</code>===
 
{| class="wikitable mw-collapsible"
//   [4, 101]
|+سجل التغييرات
 
!الإصدار
//   [5, 114]
!التغييرات
 
|-
=== التابع buf.equals(otherBuffer)‎ ===
|v8.0.0
* otherBuffer: ‏<Buffer> | <Uint8Array> نسخةٌ من Buffer أو Uint8Array التي يراد موازنتها مع buf.
|أصبح بالإمكان استعمال الكائن <code>Uint8Array</code> مع المعامل <code>otherBuffer</code> المُمرَّر إلى التابع.
يعيد هذا التابع القيمة المنطقيَّة true إن كان buf و otherBuffer متساويين بقيمة البايتات نفسها، أو القيمة المنطقيَّة false خلاف ذلك.
|-
 
|v0.11.13
|أضيف هذا التابع.
|}
*<code>otherBuffer</code>: ‏<Buffer> | <Uint8Array> نسخةٌ من <code>Buffer</code> أو <code>Uint8Array</code> التي يراد موازنتها مع buf.
يعيد هذا التابع القيمة المنطقيَّة <code>true</code> إن كان <code>buf</code> و <code>otherBuffer</code> متساويين بقيمة البايتات نفسها، أو القيمة المنطقيَّة <code>false</code> خلاف ذلك.<syntaxhighlight lang="javascript">
const buf1 = Buffer.from('ABC');
const buf1 = Buffer.from('ABC');
const buf2 = Buffer.from('414243', 'hex');
const buf2 = Buffer.from('414243', 'hex');
const buf3 = Buffer.from('ABCD');
const buf3 = Buffer.from('ABCD');


console.log(buf1.equals(buf2));
console.log(buf1.equals(buf2));
// true
// true
console.log(buf1.equals(buf3));
console.log(buf1.equals(buf3));
// false
// false
 
</syntaxhighlight>
==== سجل التغييرات ====
===<code>buf.fill(value[, offset[, end]][, encoding])‎</code>===
{| class="wikitable"
{| class="wikitable mw-collapsible"
|الإصدار
|+سجل التغييرات
|التغييرات
!الإصدار
!التغييرات
|-
|v10.0.0
|أصبح استعمال قيمة سالبة مع المعامل <code>end</code> يرمي الخطأ <code>ERR_INDEX_OUT_OF_RANGE</code>.
|-
|v10.0.0
|سيرمى استثناءٌ عند محاولة تبديل قيم صفرية مكان القيم غير الصفرية الموجودة في <code>Buffer</code>.
|-
|v10.0.0
|سيرمى خطأ عند استعمال سلسلة نصية غير صالحة مع المعامل <code>value</code>.
|-
|-
|v8.0.0
|v5.7.0
|أصبح بالإمكان استعمال الكائن Uint8Array مع المعامل otherBuffer المُمرَّر إلى التابع.
|أضيف المعامل <code>encoding</code>.
|-
|-
|v0.11.13
|v0.5.0
|أضيف هذا التابع.
|أضيف هذا التابع.
|}
|}
 
*<code>value</code>: [[JavaScript/String|‏<string>]] | <Buffer>‏‏ | ‏[[JavaScript/Number|<integer>]]‏ القيمة المراد وضعها في buf.
=== التابع buf.fill(value[, offset[, end]][, encoding])‎ ===
*<code>offset</code>: ‏[[JavaScript/Number|<integer>]] عدد البايتات المراد تخطيها في <code>buf</code> قبل البدء بملء النسخة <code>buf</code> بقيمة المعامل <code>value</code>. القيمة الافتراضيَّة هي: 0.
* value: ‏<string> | <Buffer> | <integer> القيمة المراد وضعها في buf.
*<code>end</code>: ‏[[JavaScript/Number|<integer>]] عددٌ يمثِّل البايت الذي ستتوقف عنده عملية ملء النسخة <code>buf</code> بقيمة المعامل <code>value</code> (لا يدخل هذا البايت ضمن المجال). القيمة الافتراضيَّة هي: 0.
* offset: ‏<integer> عدد البايتات المراد تخطيها في buf قبل البدء بملء النسخة buf بقيمة المعامل value. القيمة الافتراضيَّة هي: 0.
*<code>encoding</code>: ‏[[JavaScript/String|<string>]] الترميز المراد استعمال مع المعامل <code>value</code> إن كان سلسلةً نصيةً. القيمة الافتراضيَّة هي: <code>'utf8'</code>.
* end: ‏<integer> عددٌ يمثِّل البايت الذي ستتوقف عنده عملية ملء النسخة buf بقيمة المعامل value (لا يدخل هذا البايت ضمن المجال). القيمة الافتراضيَّة هي: 0.
يملأ هذا التابع النسخة <code>buf</code> بالقيمة <code>value</code> المعطاة.  إن لم يعطَ المعامل <code>offset</code> أو <code>end</code> أو كلاهما، فستملأ كامل ذاكرة <code>buf</code> بالقيمة <code>value</code> المعطاة:<syntaxhighlight lang="javascript">
* encoding: ‏<string> الترميز المراد استعمال مع المعامل value إن كان سلسلةً نصيةً. القيمة الافتراضيَّة هي: 'utf8'.
يملأ هذا التابع النسخة buf بالقيمة value المعطاة.  إن لم يعطَ المعامل offset أو end أو كلاهما، فستملأ كامل ذاكرة buf بالقيمة value المعطاة:
 
// ‘h’ بالمحرف Buffer ملء
// ‘h’ بالمحرف Buffer ملء


سطر 929: سطر 769:


console.log(b.toString());
console.log(b.toString());
// hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh :سيُطبع
// hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh :سيُطبع


ستُحوَّل القيمة value إلى النوع uint32 إن لم تكن سلسلةً نصيةً أو عددًا صحيحًا.
</syntaxhighlight>ستُحوَّل القيمة <code>value</code> إلى النوع uint32 إن لم تكن سلسلةً نصيةً أو عددًا صحيحًا.
 
عند كتابة محارف متعدِّدة البايتات ووصول التابع fill()‎ إلى عمليَّة الكتابة الأخيرة ولم يعد هنالك حجم كافٍ لكتابة محرف كامل، فستٌكتَب البايتات الأولى من ذلك المحرف التي تتسع في الحجم المتبقي. يشرح المثال التالي هذا الأمر:


عند كتابة محارف متعدِّدة البايتات ووصول التابع <code>fill()‎</code> إلى عمليَّة الكتابة الأخيرة ولم يعد هنالك حجم كافٍ لكتابة محرف كامل، فستٌكتَب البايتات الأولى من ذلك المحرف التي تتسع في الحجم المتبقي. يشرح المثال التالي هذا الأمر:<syntaxhighlight lang="javascript">
// بمحرف يتألف من بايتين `Buffer` ملء
// بمحرف يتألف من بايتين `Buffer` ملء


console.log(Buffer.allocUnsafe(3).fill('\u0222'));
console.log(Buffer.allocUnsafe(3).fill('\u0222'));
// <Buffer c8 a2 c8> :سيُطبع
// <Buffer c8 a2 c8> :سيُطبع


إن احتوى المعامل value على محارف غير صالحة، فستُقتطَع وتزال؛ وإن لم يعد هنالك بيانات صالحة لملئها، فسيرمى استثناءٌ.
</syntaxhighlight>إن احتوى المعامل <code>value</code> على محارف غير صالحة، فستُقتطَع وتزال؛ وإن لم يعد هنالك بيانات صالحة لملئها، فسيرمى استثناءٌ.<syntaxhighlight lang="javascript">
 
const buf = Buffer.allocUnsafe(5);
const buf = Buffer.allocUnsafe(5);


console.log(buf.fill('a'));
console.log(buf.fill('a'));
// <Buffer 61 61 61 61 61> :سيُطبع
// <Buffer 61 61 61 61 61> :سيُطبع
console.log(buf.fill('aazz', 'hex'));
console.log(buf.fill('aazz', 'hex'));
// <Buffer aa aa aa aa aa> :سيُطبع
// <Buffer aa aa aa aa aa> :سيُطبع
console.log(buf.fill('zz', 'hex'));
console.log(buf.fill('zz', 'hex'));
// يرمى استثناءٌ
// يرمى استثناءٌ
</syntaxhighlight>
===<code>buf.includes(value[, byteOffset][, encoding])‎</code>===
أضيف في الإصدار v5.3.0.
*<code>value</code>: [[JavaScript/String|‏<string>]] | ‏<Buffer> | ‏[[JavaScript/Number|<integer>]] القيمة المراد البحث عنها.
*<code>byteOffset</code>: [[JavaScript/Number|‏<integer>]] عدد البايتات المراد تخطيها في <code>buf</code> قبل البدء بعمليَّة البحث. القيمة الافتراضيَّة هي: 0.
*<code>encoding</code>: ‏[[JavaScript/String|<string>]] الترميز المراد استعماله مع المعامل <code>value</code> إن كان سلسلةً نصيةً. القيمة الافتراضيَّة هي: <code>'utf8'</code>.
يبحث هذا التابع عن القيمة <code>value</code> المعطاة ضمن <code>buf</code>، ويعيد القيمة المنطقيَّة <code>true</code> إن عثر عليها أو القيمة المنطقيَّة إن لم تكن <code>value</code> موجودة في <code>buf</code>.


==== سجل التغييرات ====
هذا التابع يكافئ  <code>buf.indexOf() !== -1</code>.<syntaxhighlight lang="javascript">
{| class="wikitable"
const buf = Buffer.from('this is a buffer');
|الإصدار
|التغييرات
|-
|v10.0.0
|أصبح استعمال قيمة سالبة مع المعامل end يرمي الخطأ ERR_INDEX_OUT_OF_RANGE.
|-
|v10.0.0
|سيرمى استثناءٌ عند محاولة تبديل قيم صفرية مكان القيم غير الصفرية الموجودة في Buffer.
|-
|v10.0.0
|سيرمى خطأ عند استعمال سلسلة نصية غير صالحة مع المعامل value.
|-
|v5.7.0
|أضيف المعامل encoding.
|-
|v0.5.0
|أضيف هذا التابع.
|}
 
=== التابع buf.includes(value[, byteOffset][, encoding])‎ ===
أضيف في الإصدار v5.3.0.
* value: ‏<string> | <Buffer> | <integer> القيمة المراد البحث عنها.
* byteOffset: ‏<integer> عدد البايتات المراد تخطيها في buf قبل البدء بعمليَّة البحث. القيمة الافتراضيَّة هي: 0.
* encoding: ‏<string> الترميز المراد استعماله مع المعامل value إن كان سلسلةً نصيةً. القيمة الافتراضيَّة هي: 'utf8'.
يبحث هذا التابع عن القيمة value المعطاة ضمن buf، ويعيد القيمة المنطقيَّة true إن عثر عليها أو القيمة المنطقيَّة إن لم تكن value موجودة في buf.
 
هذا التابع يكافئ  buf.indexOf() !== -1.
 
const buf = Buffer.from('this is a buffer');


console.log(buf.includes('this'));
console.log(buf.includes('this'));
// true
// true
console.log(buf.includes('is'));
console.log(buf.includes('is'));
// true
// true
console.log(buf.includes(Buffer.from('a buffer')));
console.log(buf.includes(Buffer.from('a buffer')));
// true
// true
console.log(buf.includes(97));
console.log(buf.includes(97));
// true (97 is the decimal ASCII value for 'a')
// true (97 is the decimal ASCII value for 'a')
console.log(buf.includes(Buffer.from('a buffer example')));
console.log(buf.includes(Buffer.from('a buffer example')));
// false
// false
console.log(buf.includes(Buffer.from('a buffer example').slice(0, 8)));
console.log(buf.includes(Buffer.from('a buffer example').slice(0, 8)));
// true
// true
console.log(buf.includes('this', 4));
console.log(buf.includes('this', 4));
// false
// false


=== التابع buf.indexOf(value[, byteOffset][, encoding])‎ ===
</syntaxhighlight>
* value: ‏<string> | <Buffer> | <Uint8Array> | <integer> القيمة المراد البحث عنها.
===<code>buf.indexOf(value[, byteOffset][, encoding])‎</code>===
* byteOffset: ‏<integer> عدد البايتات المراد تخطيها في buf قبل البدء بعملية البحث. القيمة الافتراضيَّة هي: 0.
{| class="wikitable mw-collapsible"
* encoding: ‏<string> إن كان المعامل value المعطى سلسلةً نصيةً، فسيثِّمل هذا المعامل الترميز المراد استعماله لتحديد التمثيل الثنائي لتلك السلسلة النصية الذي سيُبحث عنه في buf. القيمة الافتراضيَّة هي: 'utf8'.
|+سجل التغييرات
إن كان المعامل value:
!الإصدار
* سلسلةً نصيةً، فسيرمَّز وفقًا للترميز encoding المعطى ثمَّ يبحث عنه.
!التغييرات
* نسخةً من Buffer، أو Uint8Array، فستُسعمَل القيمة value المعطاة بأكملها. إن أردت البحث في جزءٍ محدَّد من Buffer، فاستعمل buf.slice()‎.
|-
* عددًا، فستعامل القيمة value على أنَّها عددٌ صحيحٌ عديم الإشارة بحجم 8 بت (أي يقع بين 0 و 255).
|v8.0.0
يعيد هذا التابع عددًا يمثل فهرس البايت الأول للقيمة value لأول ظهور لها في buf، أو القيمة ‎-1 إن لم تكن القيمة value موجودة في buf.
|أصبح بالإمكان استعمال الكائن <code>Uint8Array</code> مع المعامل <code>value</code> المُمرَّر إلى التابع.
 
|-
|v5.7.0 - v4.4.0
|عندما يُمرَّر المعامل <code>encoding</code>، ليس هنالك حاجة لاستعمال أو تمرير المعامل <code>byteOffset</code>.
|-
|v1.5.0
|أضيف هذا التابع.
|}
*<code>value</code>: ‏[[JavaScript/String|<string>]] | <Buffer> | <Uint8Array> | ‏[[JavaScript/Number|<integer>]] القيمة المراد البحث عنها.
*byteOffset: ‏[[JavaScript/Number|<integer>]] عدد البايتات المراد تخطيها في <code>buf</code> قبل البدء بعملية البحث. القيمة الافتراضيَّة هي: 0.
*encoding: ‏[[JavaScript/String|<string>]] إن كان المعامل <code>value</code> المعطى سلسلةً نصيةً، فسيثِّمل هذا المعامل الترميز المراد استعماله لتحديد التمثيل الثنائي لتلك السلسلة النصية الذي سيُبحث عنه في <code>buf</code>. القيمة الافتراضيَّة هي: <code>'utf8'.</code>
إن كان المعامل <code>value</code>:
*سلسلةً نصيةً، فسيرمَّز وفقًا للترميز <code>encoding</code> المعطى ثمَّ يبحث عنه.
*نسخةً من <code>Buffer</code>، أو <code>Uint8Array</code>، فستُسعمَل القيمة <code>value</code> المعطاة بأكملها. إن أردت البحث في جزءٍ محدَّد من <code>Buffer</code>، فاستعمل <code>buf.slice()‎</code>.
*عددًا، فستعامل القيمة <code>value</code> على أنَّها عددٌ صحيحٌ عديم الإشارة بحجم 8 بت (أي يقع بين 0 و 255).
يعيد هذا التابع عددًا يمثل فهرس البايت الأول للقيمة <code>value</code> لأول ظهور لها في <code>buf</code>، أو القيمة ‎-1 إن لم تكن القيمة <code>value</code> موجودة في <code>buf</code>.<syntaxhighlight lang="javascript">
const buf = Buffer.from('this is a buffer');
const buf = Buffer.from('this is a buffer');


console.log(buf.indexOf('this'));
console.log(buf.indexOf('this'));
// 0
// 0
console.log(buf.indexOf('is'));
console.log(buf.indexOf('is'));
// 2
// 2
console.log(buf.indexOf(Buffer.from('a buffer')));
console.log(buf.indexOf(Buffer.from('a buffer')));
// 8
// 8
console.log(buf.indexOf(97));
console.log(buf.indexOf(97));
// 8 (ASCII في الجدول 'a' العدد 97 هو قيمة المحرف)
// 8 (ASCII في الجدول 'a' العدد 97 هو قيمة المحرف)
console.log(buf.indexOf(Buffer.from('a buffer example')));
console.log(buf.indexOf(Buffer.from('a buffer example')));
// Prints: -1
// Prints: -1
console.log(buf.indexOf(Buffer.from('a buffer example').slice(0, 8)));
console.log(buf.indexOf(Buffer.from('a buffer example').slice(0, 8)));
// Prints: 8
// Prints: 8


سطر 1٬057: سطر 856:


console.log(utf16Buffer.indexOf('\u03a3', 0, 'utf16le'));
console.log(utf16Buffer.indexOf('\u03a3', 0, 'utf16le'));
// Prints: 4
// Prints: 4
console.log(utf16Buffer.indexOf('\u03a3', -4, 'utf16le'));
console.log(utf16Buffer.indexOf('\u03a3', -4, 'utf16le'));
// Prints: 6
// Prints: 6
</syntaxhighlight>إن يكن المعامل <code>value</code> سلسلةً نصيةً أو عددًا أو نسخةً من <code>Buffer</code>، فسيرمى الخطأ <code>TypeError</code>.


إن يكن المعامل value سلسلةً نصيةً أو عددًا أو نسخةً من Buffer، فسيرمى الخطأ TypeError.
إن كان المعامل <code>value</code> عددًا، فسيحول إلى قيمة بايت صحيح أو إلى عددٍ صحيح يقع في المجال بين 0 و 255.
 
إن كان المعامل value عددًا، فسيحول إلى قيمة بايت صحيح أو إلى عددٍ صحيح يقع في المجال بين 0 و 255.
 
إن لم يكن المعامل byteOffset عددًا، فسيحول رغمًا عنه إلى عدد. إن حصلنا بعد عمليَّة التحويل هذه على القيمة NaN أو 0، فسيُبحث في buf بأكملها. يطابق هذا السلوك الشكل String.indexOf()‎.


إن لم يكن المعامل <code>byteOffset</code> عددًا، فسيحول رغمًا عنه إلى عدد. إن حصلنا بعد عمليَّة التحويل هذه على القيمة <code>[[JavaScript/NaN|NaN]]</code> أو 0، فسيُبحث في <code>buf</code> بأكملها. يطابق هذا السلوك الشكل <code>String.indexOf()‎</code>.<syntaxhighlight lang="javascript">
const b = Buffer.from('abcdef');
const b = Buffer.from('abcdef');


// تمرير قيمة عدديَّة ولكنها لا تمثل بايتًا صحيحًا
// تمرير قيمة عدديَّة ولكنها لا تمثل بايتًا صحيحًا
console.log(b.indexOf(99.9));
console.log(b.indexOf(99.9));
console.log(b.indexOf(256 + 99));
console.log(b.indexOf(256 + 99));
// 'c' ستُطبع القيمة: 2، وهذا مكافئ للبحث عن العدد 99 أو المحرف
// 'c' ستُطبع القيمة: 2، وهذا مكافئ للبحث عن العدد 99 أو المحرف


// أو 0 NaN تحول إلى القيمة byteOffset تمرير قيمة للمعامل
// أو 0 NaN تحول إلى القيمة byteOffset تمرير قيمة للمعامل
console.log(b.indexOf('b', undefined));
console.log(b.indexOf('b', undefined));
console.log(b.indexOf('b', {}));
console.log(b.indexOf('b', {}));
console.log(b.indexOf('b', null));
console.log(b.indexOf('b', null));
console.log(b.indexOf('b', []));
console.log(b.indexOf('b', []));
// ستُطبع القيمة 1، إذ جرت عملية البحث في كامل المحتوى
// ستُطبع القيمة 1، إذ جرت عملية البحث في كامل المحتوى


إن كان المعامل value سلسلة نصية فارغة أو نسخة Buffer فارغة وكان المعامل byteOffset أقل من buf.length، فسيُعاد حينئذٍ المعامل byteOffset. أمَّا إن كان المعامل byteOffset أكبر أو يساوي buf.length في نفس شروط الحالة السابقة، فسيُعاد حينئذٍ buf.length.
</syntaxhighlight>إن كان المعامل <code>value</code> سلسلة نصية فارغة أو نسخة <code>Buffer</code> فارغة وكان المعامل <code>byteOffset</code> أقل من <code>buf.length</code>، فسيُعاد حينئذٍ المعامل <code>byteOffset</code>. أمَّا إن كان المعامل <code>byteOffset</code> أكبر أو يساوي <code>buf.length</code> في نفس شروط الحالة السابقة، فسيُعاد حينئذٍ <code>buf.length</code>.
 
===<code>buf.keys()‎</code>===
==== سجل التغييرات ====
{| class="wikitable"
|الإصدار
|التغييرات
|-
|v8.0.0
|أصبح بالإمكان استعمال الكائن Uint8Array مع المعامل value المُمرَّر إلى التابع.
|-
|v5.7.0 - v4.4.0
|عندما يُمرَّر المعامل encoding، ليس هنالك حاجة لاستعمال أو تمرير المعامل byteOffset.
|-
|v1.5.0
|أضيف هذا التابع.
|}
 
=== التابع buf.keys()‎ ===
أضيف في الاصدار v1.1.0.
أضيف في الاصدار v1.1.0.


ينشئ هذا التابع مُكررًا (iterator) لمفاتيح (أو فهارس) الكائن buf ثمَّ يعيده.
ينشئ هذا التابع مُكررًا (iterator) لمفاتيح (أو فهارس) الكائن <code>buf</code> ثمَّ يعيده.<syntaxhighlight lang="javascript">
 
const buf = Buffer.from('buffer');
const buf = Buffer.from('buffer');


for (const key of buf.keys()) {
for (const key of buf.keys()) {
 
  console.log(key);
 console.log(key);
 
}
}
// :سيُطبع
// :سيُطبع
//  0
//  1
//  2
//  3
//  4
//  5


//   0
</syntaxhighlight>
 
===<code>buf.lastIndexOf(value[, byteOffset][, encoding])</code>===
//   1
{| class="wikitable mw-collapsible"
 
|+سجل التغييرات
//   2
!الإصدار
 
!التغييرات
//   3
|-
 
|v8.0.0
//   4
|أصبح بالإمكان استعمال الكائن <code>Uint8Array</code> مع المعامل <code>value</code> المُمرَّر إلى التابع.
 
|-
//   5
|v6.0.0
 
|أضيف هذا التابع.
=== التابع buf.lastIndexOf(value[, byteOffset][, encoding])===
|}
* value: ‏<string> | <Buffer> | <Uint8Array> | <integer> القيمة المراد البحث عنها.
*<code>value</code>: ‏[[JavaScript/String|<string>]] | <Buffer> | <Uint8Array> | ‏[[JavaScript/Number|<integer>]]‏ القيمة المراد البحث عنها.
* byteOffset: ‏<integer> عدد البايتات المراد تخطيها في buf قبل البدء بعمليَّة البحث. القيمة الافتراضيَّة هي: buf.length - 1.
*<code>byteOffset</code>: ‏[[JavaScript/Number|<integer>]] عدد البايتات المراد تخطيها في <code>buf</code> قبل البدء بعمليَّة البحث. القيمة الافتراضيَّة هي: <code>buf.length - 1</code>.
* encoding: ‏<string> إن كان المعامل value المعطى سلسلةً نصيةً، فسيثِّمل هذا المعامل الترميز المراد استعماله لتحديد التمثيل الثنائي لتلك السلسلة النصية الذي سيُبحث عنه في buf. القيمة الافتراضية هي: 'utf8'.
*<code>encoding</code>: ‏[[JavaScript/String|<string>]] إن كان المعامل <code>value</code> المعطى سلسلةً نصيةً، فسيثِّمل هذا المعامل الترميز المراد استعماله لتحديد التمثيل الثنائي لتلك السلسلة النصية الذي سيُبحث عنه في <code>buf</code>. القيمة الافتراضية هي: <code>'utf8'</code>.
يعيد هذا التابع عددًا يمثِّل فهرس البايت الأول للقيمة value لآخر ظهور لها في buf، أو القيمة ‎-1 إن لم تكن القيمة value موجودة في buf. هذا التابع مماثل تمامًا للتابع buf.indexOf()‎ باستثناء أنَّه يبحث عن آخر ظهور للقيمة value عوضًا عن أول ظهور لها.
يعيد هذا التابع عددًا يمثِّل فهرس البايت الأول للقيمة <code>value</code> لآخر ظهور لها في <code>buf</code>، أو القيمة ‎-1 إن لم تكن القيمة <code>value</code> موجودة في <code>buf</code>. هذا التابع مماثل تمامًا للتابع <code>buf.indexOf()‎</code> باستثناء أنَّه يبحث عن آخر ظهور للقيمة <code>value</code> عوضًا عن أول ظهور لها.<syntaxhighlight lang="javascript">
 
const buf = Buffer.from('this buffer is a buffer');
const buf = Buffer.from('this buffer is a buffer');


console.log(buf.lastIndexOf('this'));
console.log(buf.lastIndexOf('this'));
// 0
// 0
console.log(buf.lastIndexOf('buffer'));
console.log(buf.lastIndexOf('buffer'));
// 17
// 17
console.log(buf.lastIndexOf(Buffer.from('buffer')));
console.log(buf.lastIndexOf(Buffer.from('buffer')));
// 17
// 17
console.log(buf.lastIndexOf(97));
console.log(buf.lastIndexOf(97));
// 15 (ASCII في الجدول 'a' العدد 97 هو قيمة المحرف)
// 15 (ASCII في الجدول 'a' العدد 97 هو قيمة المحرف)
console.log(buf.lastIndexOf(Buffer.from('yolo')));
console.log(buf.lastIndexOf(Buffer.from('yolo')));
// -1
// -1
console.log(buf.lastIndexOf('buffer', 5));
console.log(buf.lastIndexOf('buffer', 5));
// 5
// 5
console.log(buf.lastIndexOf('buffer', 4));
console.log(buf.lastIndexOf('buffer', 4));
// -1
// -1


سطر 1٬175: سطر 933:


console.log(utf16Buffer.lastIndexOf('\u03a3', undefined, 'utf16le'));
console.log(utf16Buffer.lastIndexOf('\u03a3', undefined, 'utf16le'));
// 6
// 6
console.log(utf16Buffer.lastIndexOf('\u03a3', -5, 'utf16le'));
console.log(utf16Buffer.lastIndexOf('\u03a3', -5, 'utf16le'));
// 4
// 4
</syntaxhighlight>إن يكن المعامل <code>value</code> سلسلةً نصيةً أو عددًا أو نسخةً من <code>Buffer</code>، فسيُرمى الخطأ <code>TypeError</code>.


إن يكن المعامل value سلسلةً نصيةً أو عددًا أو نسخةً من Buffer، فسيُرمى الخطأ TypeError.
إن كان المعامل <code>value</code> عددًا، فسيُحوَّل إلى قيمة بايت صحيح أو إلى عدد صحيح يقع في المجال بين 0 و 255.
 
إن كان المعامل value عددًا، فسيُحوَّل إلى قيمة بايت صحيح أو إلى عدد صحيح يقع في المجال بين 0 و 255.
 
إن لم يكن المعامل byteOffset عددًا، فسيحول رغمًا عنه إلى عدد. إن حصلنا بعد عملية التحويل هذه على القيمة NaN (مثل {} أو undefined)، فسيُبحث في buf بأكملها. يطابق هذا السلوك الشكل String#lastIndexOf()‎.


إن لم يكن المعامل <code>byteOffset</code> عددًا، فسيحول رغمًا عنه إلى عدد. إن حصلنا بعد عملية التحويل هذه على القيمة <code>[[JavaScript/NaN|NaN]]</code> (مثل <code>{}</code> أو <code>[[JavaScript/undefined|undefined]]</code>)، فسيُبحث في <code>buf</code> بأكملها. يطابق هذا السلوك الشكل <code>String.lastIndexOf()‎</code>.<syntaxhighlight lang="javascript">
const b = Buffer.from('abcdef');
const b = Buffer.from('abcdef');


// تمرير قيمة عددية ولكنها لا تمثِّل بايتًا صحيحًا
// تمرير قيمة عددية ولكنها لا تمثِّل بايتًا صحيحًا
console.log(b.lastIndexOf(99.9));
console.log(b.lastIndexOf(99.9));
console.log(b.lastIndexOf(256 + 99));
console.log(b.lastIndexOf(256 + 99));
// 'c' ستُطبع القيمة: 2، وهذا مكافئ للبحث عن العدد 99 أو المحرف
// 'c' ستُطبع القيمة: 2، وهذا مكافئ للبحث عن العدد 99 أو المحرف


// NaN تحول إلى القيمة byteOffset تمرير قيمة للمعامل
// NaN تحول إلى القيمة byteOffset تمرير قيمة للمعامل
console.log(b.lastIndexOf('b', undefined));
console.log(b.lastIndexOf('b', undefined));
console.log(b.lastIndexOf('b', {}));
console.log(b.lastIndexOf('b', {}));
// ستُطبع القيمة 1، إذ جرت عمليَّة البحث في كامل المحتوى


// ستُطبع القيمة 1، إذ جرت عمليَّة البحث في كامل المحتوى


// تحول إلى القيمة 0 byteOffset تمرير قيمة للمعامل
// تحول إلى القيمة 0 byteOffset تمرير قيمة للمعامل
console.log(b.lastIndexOf('b', null));
console.log(b.lastIndexOf('b', null));
console.log(b.lastIndexOf('b', []));
console.log(b.lastIndexOf('b', []));
// ستُطبع القيمة -1، وهذا يكافئ تمرير القيمة 0
// ستُطبع القيمة -1، وهذا يكافئ تمرير القيمة 0


إن كان المعامل value سلسلةً نصيةً فارغةً أو نسخة Buffer فارغة، فستُعاد حينئذٍ قيمة المعامل byteOffset.
</syntaxhighlight>إن كان المعامل <code>value</code> سلسلةً نصيةً فارغةً أو نسخة <code>Buffer</code> فارغة، فستُعاد حينئذٍ قيمة المعامل <code>byteOffset</code>.
===الخاصية <code>buf.length</code>===
أضيف في الاصدار v0.1.90.


==== سجل التغييرات ====
تعيد هذه الخاصِّيَّة حجم الذاكرة المحجوز للنسخة <code>buf</code> بواحدة البايت. انتبه إلى أنَّ هذا الحجم لا يمثِّل بالضرورة حجم الذاكرة المستهلكة ضمن <code>buf</code>.<syntaxhighlight lang="javascript">
{| class="wikitable"
// عليها ASCII ثمَّ كتابة سلسلة نصية بترميز Buffer إنشاء نسخة جديدة
|الإصدار
|التغييرات
|-
|v8.0.0
|أصبح بالإمكان استعمال الكائن Uint8Array مع المعامل value المُمرَّر إلى التابع.
|-
|v6.0.0
|أضيف هذا التابع.
|}
 
=== الخاصية buf.length ===
أضيف في الاصدار v0.1.90.
 
تعيد هذه الخاصِّيَّة حجم الذاكرة المحجوز للنسخة buf بواحدة البايت. انتبه إلى أنَّ هذا الحجم لا يمثِّل بالضرورة حجم الذاكرة المستهلكة ضمن buf.
 
// عليها ASCII ثمَّ كتابة سلسلة نصية بترميز Buffer إنشاء نسخة جديدة


const buf = Buffer.alloc(1234);
const buf = Buffer.alloc(1234);


console.log(buf.length);
console.log(buf.length);
// سيُطبع: 1234
// سيُطبع: 1234


سطر 1٬244: سطر 974:


console.log(buf.length);
console.log(buf.length);
// سيُطبع 1234
// سيُطبع 1234
 
</syntaxhighlight>لمَّا كانت الخاصِّيَّة <code>length</code> غير ثابتة، فيمكن أن يؤدي تغيير قيمتها إلى الحصول على سلوك غير مُعرَّف وغير منتظم. يجب على التطبيقات التي ترغب بتعديل حجم نسخةٍ من <code>Buffer</code> أن تعامل الخاصِّيَّة <code>length</code> كقيمة قابلة للقراءة فقط، وأن تستعمل <code>buf.slice()‎</code> لاقتطاع جزءٍ من <code>Buffer</code>.<syntaxhighlight lang="javascript">
لمَّا كانت الخاصِّيَّة length غير ثابتة، فيمكن أن يؤدي تغيير قيمتها إلى الحصول على سلوك غير مُعرَّف وغير منتظم. يجب على التطبيقات التي ترغب بتعديل حجم نسخةٍ من Buffer أن تعامل الخاصِّيَّة length كقيمة قابلة للقراءة فقط، وأن تستعمل buf.slice()‎ لاقتطاع جزءٍ من Buffer.
 
let buf = Buffer.allocUnsafe(10);
let buf = Buffer.allocUnsafe(10);


سطر 1٬254: سطر 981:


console.log(buf.length);
console.log(buf.length);
// 10
// 10


سطر 1٬260: سطر 986:


console.log(buf.length);
console.log(buf.length);
// 5
// 5


=== الخاصية buf.parent ===
</syntaxhighlight>
===الخاصية <code>buf.parent</code>===
أضيف في الإصدار v8.0.0.
أضيف في الإصدار v8.0.0.


الاستقرار: 0-مهمل: استعمل الخاصِّيَّة buf.buffer عوضًا عنها.
الاستقرار: 0-مهمل: استعمل الخاصِّيَّة <code>buf.buffer</code> عوضًا عنها.
 
 
هذه الخاصِّيَّة هي اسمٌ بديلٌ مهمل للخاصِّيَّة buf.buffer.
هذه الخاصِّيَّة هي اسمٌ بديلٌ مهمل للخاصِّيَّة <code>buf.buffer</code>.
 
===<code>buf.readDoubleBE(offset)‎</code>، و <code>buf.readDoubleLE(offset)‎</code>===
=== التابع buf.readDoubleBE(offset)‎ والتابع buf.readDoubleLE(offset)‎ ===
{| class="wikitable mw-collapsible"
* offset: ‏<integer> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال ‎0 <= offset <= buf.length - 8.
|+سجل التغييرات
يقرأ هذا التابع الأعداد العشريَّة المضاعفة (double) ذات الحجم 64 بت من buf بدءًا من البايت offset المعطى مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة ثمَّ يعيدها. إن كانت البتات الأقل أهميَّة مُخزَّنة أولًا (big endian)، فاستعمل readDoubleBE()‎؛ وإن كانت البتات الأكثر أهميَّة مُخزَّنة أولًا (little endian)، فاستعمل readDoubleLE()‎.
!الإصدار
 
!التغييرات
const buf = Buffer.from([1, 2, 3, 4, 5, 6, 7, 8]);
|-
|v10.0.0
|حذف المعامل <code>noAssert</code>، ولم يعد يُحوَّل المعامل <code>offset</code> إلى النوع <code>uint32</code> ضمنيًّا بعد الآن.
|-
|v0.11.15
|أضيف هذا التابع.
|}
*<code>offset</code>: [[JavaScript/Number|‏<integer>]] عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال ‎<code>0 <= offset <= buf.length - 8</code>.
يقرأ هذا التابع الأعداد العشريَّة المضاعفة (double) ذات الحجم 64 بت من <code>buf</code> بدءًا من البايت <code>offset</code> المعطى مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة ثمَّ يعيدها. إن كانت البتات الأقل أهميَّة مُخزَّنة أولًا (big endian)، فاستعمل <code>readDoubleBE()‎</code>؛ وإن كانت البتات الأكثر أهميَّة مُخزَّنة أولًا (little endian)، فاستعمل <code>readDoubleLE()</code>‎.<syntaxhighlight lang="javascript">
const buf = Buffer.from([1, 2, 3, 4, 5, 6, 7, 8]);


console.log(buf.readDoubleBE(0));
console.log(buf.readDoubleBE(0));
// 8.20788039913184e-304
// 8.20788039913184e-304
console.log(buf.readDoubleLE(0));
console.log(buf.readDoubleLE(0));
// 5.447603722011605e-270
// 5.447603722011605e-270
console.log(buf.readDoubleLE(1));
console.log(buf.readDoubleLE(1));
// ERR_OUT_OF_RANGE يرمى الخطأ
// ERR_OUT_OF_RANGE يرمى الخطأ
 
</syntaxhighlight>
==== سجل التغييرات ====
===<code>buf.readFloatBE(offset)‎</code> و <code>buf.readFloatLE(offset)‎</code>===
{| class="wikitable"
{| class="wikitable"
|الإصدار
!الإصدار
|التغييرات
!التغييرات
|-
|-
|v10.0.0
|v10.0.0
|حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
|حذف المعامل <code>noAssert</code>، ولم يعد يُحوَّل المعامل <code>offset</code> إلى النوع <code>uint32</code> ضمنيًّا بعد الآن.
|-
|-
|v0.11.15
|v0.11.15
|أضيف هذا التابع.
|أضيف هذا التابع.
|}
|}
 
*<code>offset</code>: ‏[[JavaScript/Number|<integer>]] عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة، ويجب أن تقع القيمة المعطاة بين المجال ‎<code>0 <= offset <= buf.length - 4</code>.
=== التابع buf.readFloatBE(offset)‎ والتابع buf.readFloatLE(offset)‎ ===
يقرأ هذا التابع الأعداد العشرية (float) ذات الحجم 32 بت من <code>buf</code> بدءًا من البايت <code>offset</code> المعطى مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة ثمَّ يعيدها. إن كانت البتات الأقل أهميَّة مُخزَّنة أولًا (big endian)، فاستعمل <code>readFloatBE()‎</code>؛ وإن كانت البتات الأكثر أهمية مُخزَّنة أولًا (little endian)، فاستعمل <code>readFloatLE()‎</code>.<syntaxhighlight lang="javascript">
* offset: ‏<integer> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة، ويجب أن تقع القيمة المعطاة بين المجال ‎0 <= offset <= buf.length - 4.
يقرأ هذا التابع الأعداد العشرية (float) ذات الحجم 32 بت من buf بدءًا من البايت offset المعطى مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة ثمَّ يعيدها. إن كانت البتات الأقل أهميَّة مُخزَّنة أولًا (big endian)، فاستعمل readFloatBE()‎؛ وإن كانت البتات الأكثر أهمية مُخزَّنة أولًا (little endian)، فاستعمل readFloatLE()‎.
 
const buf = Buffer.from([1, 2, 3, 4]);
const buf = Buffer.from([1, 2, 3, 4]);


console.log(buf.readFloatBE(0));
console.log(buf.readFloatBE(0));
// Prints: 2.387939260590663e-38
// Prints: 2.387939260590663e-38
console.log(buf.readFloatLE(0));
console.log(buf.readFloatLE(0));
// Prints: 1.539989614439558e-36
// Prints: 1.539989614439558e-36
console.log(buf.readFloatLE(1));
console.log(buf.readFloatLE(1));
// ERR_OUT_OF_RANGE يرمى الخطأ
// ERR_OUT_OF_RANGE يرمى الخطأ


==== سجل التغييرات ====
</syntaxhighlight>
{| class="wikitable"
===<code>buf.readInt8(offset)‎</code>===
|الإصدار
{| class="wikitable mw-collapsible"
|التغييرات
|+سجل التغييرات
!الإصدار
!التغييرات
|-
|-
|v10.0.0
|v10.0.0
|حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
|حذف المعامل <code>noAssert</code>، ولم يعد يُحوَّل المعامل <code>offset</code> إلى النوع <code>uint32</code> ضمنيًّا بعد الآن.
|-
|-
|v0.11.15
|v0.5.0
|أضيف هذا التابع.
|أضيف هذا التابع.
|}
|}
*<code>offset</code>: ‏[[JavaScript/Number|<integer>]] عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة، ويجب أن تقع القيمة المعطاة بين المجال ‎<code>0 <= offset <= buf.length - 1</code>.
يقرأ هذا التابع الأعداد الصحيحة ذات الإشارة (signed integer) التي حجمها 8 بت من <code>buf</code> بدءًا من البايت <code>offset</code> المعطى ثمَّ يعيدها.


=== التابع buf.readInt8(offset)‎ ===
تفسَّر الأعداد الصحيحة المقروءة من نسخة <code>Buffer</code> على أنَّها قيمٌ متمِّمة ثنائيًّا (two's complement) وذات إشارة.<syntaxhighlight lang="javascript">
* offset: ‏<integer> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة، ويجب أن تقع القيمة المعطاة بين المجال ‎0 <= offset <= buf.length - 1.
يقرأ هذا التابع الأعداد الصحيحة ذات الإشارة (signed integer) التي حجمها 8 بت من buf بدءًا من البايت offset المعطى ثمَّ يعيدها.
 
تفسَّر الأعداد الصحيحة المقروءة من نسخة Buffer على أنَّها قيمٌ متمِّمة ثنائيًّا (two's complement) وذات إشارة.
 
const buf = Buffer.from([-1, 5]);
const buf = Buffer.from([-1, 5]);


console.log(buf.readInt8(0));
console.log(buf.readInt8(0));
// Prints: -1
// Prints: -1
console.log(buf.readInt8(1));
console.log(buf.readInt8(1));
// Prints: 5
// Prints: 5
console.log(buf.readInt8(2));
console.log(buf.readInt8(2));
// ERR_OUT_OF_RANGE يرمى الخطأ
// ERR_OUT_OF_RANGE يرمى الخطأ


==== سجل التغييرات ====
</syntaxhighlight>
{| class="wikitable"
===<code>buf.readInt16BE(offset)‎</code> و <code>buf.readInt16LE(offset)‎</code>===
|الإصدار
{| class="wikitable mw-collapsible"
|التغييرات
|+سجل التغييرات
!الإصدار
!التغييرات
|-
|-
|v10.0.0
|v10.0.0
|حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
|حذف المعامل <code>noAssert</code>، ولم يعد يُحوَّل المعامل <code>offset</code> إلى النوع <code>uint32</code> ضمنيًّا بعد الآن.
|-
|-
|v0.5.0
|v0.5.5
|أضيف هذا التابع.
|أضيف هذا التابع.
|}
|}
*<code>offset</code>: ‏[[JavaScript/Number|<integer>]] عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة، ويجب أن تقع القيمة المعطاة بين المجال ‎<code>0 <= offset <= buf.length - 2</code>.
يقرأ هذا التابع الأعداد الصحيحة ذات الإشارة (signed integer) التي حجمها 16 بت من <code>buf</code> بدءًا من البايت <code>offset</code> المعطى مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزنة أولًا في الذاكرة ثمَّ يعيدها. إن كانت البتات الأقل أهميَّة مُخزَّنة أولًا (big endian)، فاستعمل <code>readInt16BE()‎</code>؛ وإن كانت البتات الأكثر أهمية مُخزَّنة أولًا (little endian)، فاستعمل <code>readInt16LE()‎</code>.


=== التابع buf.readInt16BE(offset)‎ والتابع buf.readInt16LE(offset)‎ ===
تفسَّر الأعداد الصحيحة المقروءة من نسخة <code>Buffer</code> على أنَّها قيمٌ متمِّمة ثنائيًّا (two's complement) وذات إشارة.<syntaxhighlight lang="javascript">
* offset: ‏<integer> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة، ويجب أن تقع القيمة المعطاة بين المجال ‎0 <= offset <= buf.length - 2.
يقرأ هذا التابع الأعداد الصحيحة ذات الإشارة (signed integer) التي حجمها 16 بت من buf بدءًا من البايت offset المعطى مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزنة أولًا في الذاكرة ثمَّ يعيدها. إن كانت البتات الأقل أهميَّة مُخزَّنة أولًا (big endian)، فاستعمل readInt16BE()‎؛ وإن كانت البتات الأكثر أهمية مُخزَّنة أولًا (little endian)، فاستعمل readInt16LE()‎.
 
تفسَّر الأعداد الصحيحة المقروءة من نسخة Buffer على أنَّها قيمٌ متمِّمة ثنائيًّا (two's complement) وذات إشارة.
 
const buf = Buffer.from([1, 2, 3, 4]);
const buf = Buffer.from([1, 2, 3, 4]);
const buf = Buffer.from([0, 5]);
const buf = Buffer.from([0, 5]);


console.log(buf.readInt16BE(0));
console.log(buf.readInt16BE(0));
// Prints: 5
// Prints: 5
console.log(buf.readInt16LE(0));
console.log(buf.readInt16LE(0));
// Prints: 1280
// Prints: 1280
console.log(buf.readInt16LE(1));
console.log(buf.readInt16LE(1));
// ERR_OUT_OF_RANGE يرمى الخطأ
// ERR_OUT_OF_RANGE يرمى الخطأ


==== سجل التغييرات ====
</syntaxhighlight>
{| class="wikitable"
===<code>buf.readInt32BE(offset)‎</code> و <code>buf.readInt32LE(offset)</code>‎===
|الإصدار
{| class="wikitable mw-collapsible"
|التغييرات
|+سجل التغييرات
!الإصدار
!التغييرات
|-
|-
|v10.0.0
|v10.0.0
|حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
|حذف المعامل <code>noAssert</code>، ولم يعد يُحوَّل المعامل <code>offset</code> إلى النوع <code>uint32</code> ضمنيًّا بعد الآن.
|-
|-
|v0.5.5
|v0.5.5
|أضيف هذا التابع.
|أضيف هذا التابع.
|}
|}
*<code>offset</code>: ‏[[JavaScript/Number|<integer>]] عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة، ويجب أن تقع القيمة المعطاة بين المجال ‎<code>0 <= offset <= buf.length - 4</code>.
يقرأ هذا التابع الأعداد الصحيحة ذات الإشارة (signed integer) التي حجمها 32 بت من <code>buf</code> بدءًا من البايت <code>offset</code> المعطى مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة ثمَّ يعيدها. إن كانت البتات الأقل أهمية مُخزَّنة أولًا (big endian)، فاستعمل <code>readInt32BE()‎</code>؛ وإن كانت البتات الأكثر أهمية مُخزَّنة أولًا (little endian)، فاستعمل <code>readInt32LE()‎</code>.


=== التابع buf.readInt32BE(offset)‎ والتابع buf.readInt32LE(offset)‎ ===
تفسَّر الأعداد الصحيحة المقروءة من نسخة <code>Buffer</code> على أنَّها قيم متمِّمة ثنائيًّا (two's complement) وذات إشارة.<syntaxhighlight lang="javascript">
* offset: ‏<integer> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة، ويجب أن تقع القيمة المعطاة بين المجال ‎0 <= offset <= buf.length - 4.
يقرأ هذا التابع الأعداد الصحيحة ذات الإشارة (signed integer) التي حجمها 32 بت من buf بدءًا من البايت offset المعطى مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة ثمَّ يعيدها. إن كانت البتات الأقل أهمية مُخزَّنة أولًا (big endian)، فاستعمل readInt32BE()‎؛ وإن كانت البتات الأكثر أهمية مُخزَّنة أولًا (little endian)، فاستعمل readInt32LE()‎.
 
تفسَّر الأعداد الصحيحة المقروءة من نسخة Buffer على أنَّها قيم متمِّمة ثنائيًّا (two's complement) وذات إشارة.
 
const buf = Buffer.from([0, 0, 0, 5]);
const buf = Buffer.from([0, 0, 0, 5]);


console.log(buf.readInt32BE(0));
console.log(buf.readInt32BE(0));
// Prints: 5
// Prints: 5
console.log(buf.readInt32LE(0));
console.log(buf.readInt32LE(0));
// Prints: 83886080
// Prints: 83886080
console.log(buf.readInt32LE(1));
console.log(buf.readInt32LE(1));
// ERR_OUT_OF_RANGE يرمى الخطأ
// ERR_OUT_OF_RANGE يرمى الخطأ


==== سجل التغييرات ====
</syntaxhighlight>
{| class="wikitable"
===<code>buf.readIntBE(offset, byteLength)‎</code> و <code>buf.readIntLE(offset, byteLength)‎</code>===
|الإصدار
{| class="wikitable mw-collapsible"
|التغييرات
|+سجل التغييرات
!الإصدار
!التغييرات
|-
|-
|v10.0.0
|v10.0.0
|حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
|حُذف المعامل <code>noAssert</code>، ولم يعد يُحوَّل المعامل <code>offset</code> والمعامل <code>byteLength</code> إلى النوع <code>uint32</code> ضمنيًّا بعد الآن.
|-
|-
|v0.5.5
|v0.11.15
|أضيف هذا التابع.
|أضيف هذا التابع.
|}
|}
*<code>offset</code>: ‏[[JavaScript/Number|<integer>]] عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة، ويجب أن تقع قيمة هذا المعامل في المجال ‎<code>0 <= offset <= buf.length - byteLength</code>.
*<code>byteLength</code>: ‏[[JavaScript/Number|<integer>]] عدد البايتات المراد قراءتها، ويجب أن تقع بين قيمة هذا المعامل في المجال <code>0‎ < byteLength <= 6</code>.
يقرأ هذا التابع الأعداد الصحيحة ذات الإشارة (signed integer) التي حجمها هو <code>byteLength</code> المعطى من <code>buf</code> بدءًا من البايت <code>offset</code> المعطى مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة ثمَّ يعيدها. إن كانت البتات الأقل أهمية مُخزَّنة أولًا (big endian)، فاستعمل <code>readIntBE()</code>‎؛ وإن كانت البتات الأكثر أهمية مُخزَّنة أولًا (little endian)، فاستعمل <code>readIntLE()</code>‎.


=== التابع buf.readIntBE(offset, byteLength)‎ والتابع buf.readIntLE(offset, byteLength)‎ ===
تفسَّر الأعداد الصحيحة المقروءة من نسخة <code>Buffer</code> على أنَّها قيم متمِّمة ثنائيًّا (two's complement) وذات إشارة. تدعم هذه الدالة قراءة الأعداد الصحيحة بدقة تصل إلى 48 بت.<syntaxhighlight lang="javascript">
* offset: ‏<integer> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة، ويجب أن تقع قيمة هذا المعامل في المجال ‎0 <= offset <= buf.length - byteLength.
* byteLength: ‏<integer> عدد البايتات المراد قراءتها، ويجب أن تقع بين قيمة هذا المعامل في المجال 0‎ < byteLength <= 6.
يقرأ هذا التابع الأعداد الصحيحة ذات الإشارة (signed integer) التي حجمها هو byteLength المعطى من buf بدءًا من البايت offset المعطى مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة ثمَّ يعيدها. إن كانت البتات الأقل أهمية مُخزَّنة أولًا (big endian)، فاستعمل readIntBE()‎؛ وإن كانت البتات الأكثر أهمية مُخزَّنة أولًا (little endian)، فاستعمل readIntLE()‎.
 
تفسَّر الأعداد الصحيحة المقروءة من نسخة Buffer على أنَّها قيم متمِّمة ثنائيًّا (two's complement) وذات إشارة. تدعم هذه الدالة قراءة الأعداد الصحيحة بدقة تصل إلى 48 بت.
 
const buf = Buffer.from([0, 0, 0, 5]);
const buf = Buffer.from([0, 0, 0, 5]);


سطر 1٬440: سطر 1٬142:


console.log(buf.readIntLE(0, 6).toString(16));
console.log(buf.readIntLE(0, 6).toString(16));
// -546f87a9cbee
// -546f87a9cbee
console.log(buf.readIntBE(0, 6).toString(16));
console.log(buf.readIntBE(0, 6).toString(16));
// 1234567890ab
// 1234567890ab
console.log(buf.readIntBE(1, 6).toString(16));
console.log(buf.readIntBE(1, 6).toString(16));
// ERR_INDEX_OUT_OF_RANGE يرمى الخطأ
// ERR_INDEX_OUT_OF_RANGE يرمى الخطأ
console.log(buf.readIntBE(1, 0).toString(16));
console.log(buf.readIntBE(1, 0).toString(16));
// ERR_OUT_OF_RANGE يرمى الخطأ
// ERR_OUT_OF_RANGE يرمى الخطأ


==== سجل التغييرات ====
</syntaxhighlight>
{| class="wikitable"
===<code>buf.readUInt8(offset)‎</code>===
|الإصدار
{| class="wikitable mw-collapsible"
|التغييرات
|+سجل التغييرات
!الإصدار
!التغييرات
|-
|-
|v10.0.0
|v10.0.0
|حُذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset والمعامل byteLength إلى النوع uint32 ضمنيًّا بعد الآن.
|حذف المعامل <code>noAssert</code>، ولم يعد يُحوَّل المعامل <code>offset</code> إلى النوع <code>uint32</code> ضمنيًّا بعد الآن.
|-
|-
|v0.11.15
|v0.5.0
|أضيف هذا التابع.
|أضيف هذا التابع.
|}
|}
 
*<code>offset</code>: ‏[[JavaScript/Number|<integer>]] عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة، ويجب أن تقع قيمة هذا المعامل في المجال ‎<code>0 <= offset <= buf.length - 1</code>.
=== التابع buf.readUInt8(offset)‎ ===
يقرأ هذا التابع الأعداد الصحيحة عديمة الإشارة (unsigned integer) ذات الحجم 8 بت من <code>buf</code> بدءًا من البايت <code>offset</code> المعطى ثمَّ يعيدها.<syntaxhighlight lang="javascript">
* offset: ‏<integer> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة، ويجب أن تقع قيمة هذا المعامل في المجال ‎0 <= offset <= buf.length - 1.
يقرأ هذا التابع الأعداد الصحيحة عديمة الإشارة (unsigned integer) ذات الحجم 8 بت من buf بدءًا من البايت offset المعطى ثمَّ يعيدها.
 
const buf = Buffer.from([-1, 5]);
const buf = Buffer.from([-1, 5]);


console.log(buf.readInt8(0));
console.log(buf.readInt8(0));
// Prints: -1
// Prints: -1
console.log(buf.readInt8(1));
console.log(buf.readInt8(1));
// Prints: 5
// Prints: 5
console.log(buf.readInt8(2));
console.log(buf.readInt8(2));
// ERR_OUT_OF_RANGE يرمى الخطأ
// ERR_OUT_OF_RANGE يرمى الخطأ


==== سجل التغييرات ====
</syntaxhighlight>
{| class="wikitable"
===<code>buf.readUInt16BE(offset)‎</code> و <code>buf.readUInt16LE(offset)‎</code>===
|الإصدار
{| class="wikitable mw-collapsible"
|التغييرات
|+سجل التغييرات
!الإصدار
!التغييرات
|-
|-
|v10.0.0
|v10.0.0
|حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
|حذف المعامل <code>noAssert</code>، ولم يعد يُحوَّل المعامل <code>offset</code> إلى النوع <code>uint32</code> ضمنيًّا بعد الآن.
|-
|-
|v0.5.0
|v0.5.5
|أضيف هذا التابع.
|أضيف هذا التابع.
|}
|}
 
*<code>offset</code>: ‏[[JavaScript/Number|<integer>]] عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة، ويجب أن تقع القيمة المعطاة بين المجال ‎<code>0 <= offset <= buf.length - 2</code>.
=== التابع buf.readUInt16BE(offset)‎ والتابع buf.readUInt16LE(offset)‎ ===
يقرأ هذا التابع الأعداد الصحيحة عديمة الإشارة (unsigned integer) ذات الحجم 16 بت من <code>buf</code> بدءًا من البايت <code>offset</code> المعطى مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة ثمَّ يعيدها. إن كانت البتات الأقل أهميَّة مُخزَّنة أولًا (big endian)، فاستعمل <code>readUInt16BE()</code>‎؛ وإن كانت البتات الأكثر أهميَّة مُخزَّنة أولًا (little endian)، فاستعمل <code>readUInt16LE()‎</code>.<syntaxhighlight lang="javascript">
* offset: ‏<integer> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة، ويجب أن تقع القيمة المعطاة بين المجال ‎0 <= offset <= buf.length - 2.
يقرأ هذا التابع الأعداد الصحيحة عديمة الإشارة (unsigned integer) ذات الحجم 16 بت من buf بدءًا من البايت offset المعطى مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة ثمَّ يعيدها. إن كانت البتات الأقل أهميَّة مُخزَّنة أولًا (big endian)، فاستعمل readUInt16BE()‎؛ وإن كانت البتات الأكثر أهميَّة مُخزَّنة أولًا (little endian)، فاستعمل readUInt16LE()‎.
 
const buf = Buffer.from([0x12, 0x34, 0x56]);
const buf = Buffer.from([0x12, 0x34, 0x56]);


console.log(buf.readUInt16BE(0).toString(16));
console.log(buf.readUInt16BE(0).toString(16));
// Prints: 1234
// Prints: 1234
console.log(buf.readUInt16LE(0).toString(16));
console.log(buf.readUInt16LE(0).toString(16));
// Prints: 3412
// Prints: 3412
console.log(buf.readUInt16BE(1).toString(16));
console.log(buf.readUInt16BE(1).toString(16));
// Prints: 3456
// Prints: 3456
console.log(buf.readUInt16LE(1).toString(16));
console.log(buf.readUInt16LE(1).toString(16));
// Prints: 5634
// Prints: 5634
console.log(buf.readUInt16LE(2).toString(16));
console.log(buf.readUInt16LE(2).toString(16));
// ERR_OUT_OF_RANGE يرمى الخطأ
// ERR_OUT_OF_RANGE يرمى الخطأ


==== سجل التغييرات ====
</syntaxhighlight>
{| class="wikitable"
===<code>buf.readUInt32BE(offset)‎</code> و <code>buf.readUInt32LE(offset)‎</code>===
|الإصدار
{| class="wikitable mw-collapsible"
|التغييرات
|+سجل التغييرات
!الإصدار
!التغييرات
|-
|-
|v10.0.0
|v10.0.0
|حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
|حذف المعامل <code>noAssert</code>، ولم يعد يُحوَّل المعامل <code>offset</code> إلى النوع <code>uint32</code> ضمنيًّا بعد الآن.
|-
|-
|v0.5.5
|v0.5.5
|أضيف هذا التابع.
|أضيف هذا التابع.
|}
|}
*<code>offset</code>: ‏[[JavaScript/Number|<integer>]] عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة، ويجب أن تقع القيمة المعطاة بين المجال ‎<code>0 <= offset <= buf.length - 4</code>.
يقرأ هذا التابع الأعداد الصحيحة عديمة الإشارة (unsigned integer) ذات الحجم 32 بت من <code>buf</code> بدءًا من البايت <code>offset</code> المعطى مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة ثمَّ يعيدها. إن كانت البتات الأقل أهمية مُخزَّنة أولًا (big endian)، فاستعمل <code>readUInt32BE()</code>‎؛ وإن كانت البتات الأكثر أهمية مُخزَّنة أولًا (little endian)، فاستعمل <code>readUInt32LE()‎</code>.


=== التابع buf.readUInt32BE(offset)‎ والتابع buf.readUInt32LE(offset)‎ ===
تُفسَّر الأعداد الصحيحة المقروءة من نسخة <code>Buffer</code> على أنَّها قيم متمِّمة ثنائيًّا (two's complement) وعديمة الإشارة.<syntaxhighlight lang="javascript">
* offset: ‏<integer> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة، ويجب أن تقع القيمة المعطاة بين المجال ‎0 <= offset <= buf.length - 4.
يقرأ هذا التابع الأعداد الصحيحة عديمة الإشارة (unsigned integer) ذات الحجم 32 بت من buf بدءًا من البايت offset المعطى مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة ثمَّ يعيدها. إن كانت البتات الأقل أهمية مُخزَّنة أولًا (big endian)، فاستعمل readUInt32BE()‎؛ وإن كانت البتات الأكثر أهمية مُخزَّنة أولًا (little endian)، فاستعمل readUInt32LE()‎.
 
تُفسَّر الأعداد الصحيحة المقروءة من نسخة Buffer على أنَّها قيم متمِّمة ثنائيًّا (two's complement) وعديمة الإشارة.
 
const buf = Buffer.from([0x12, 0x34, 0x56, 0x78]);
const buf = Buffer.from([0x12, 0x34, 0x56, 0x78]);


console.log(buf.readUInt32BE(0).toString(16));
console.log(buf.readUInt32BE(0).toString(16));
// Prints: 12345678
// Prints: 12345678
console.log(buf.readUInt32LE(0).toString(16));
console.log(buf.readUInt32LE(0).toString(16));
// Prints: 78563412
// Prints: 78563412
console.log(buf.readUInt32LE(1).toString(16));
console.log(buf.readUInt32LE(1).toString(16));
// ERR_OUT_OF_RANGE يرمى الخطأ
// ERR_OUT_OF_RANGE يرمى الخطأ


==== سجل التغييرات ====
</syntaxhighlight>
{| class="wikitable"
===<code>buf.readUIntBE(offset, byteLength)‎</code> و <code>buf.readUIntLE(offset, byteLength)‎</code>===
|الإصدار
{| class="wikitable mw-collapsible"
|التغييرات
|+سجل التغييرات
!الإصدار
!التغييرات
|-
|-
|v10.0.0
|v10.0.0
|حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
|حذف المعامل <code>noAssert</code>، ولم يعد يُحوَّل المعامل <code>offset</code> والمعامل <code>byteLength</code> إلى النوع <code>uint32</code> ضمنيًّا بعد الآن.
|-
|-
|v0.5.5
|v0.11.15
|أضيف هذا التابع.
|أضيف هذا التابع.
|}
|}
*<code>offset</code>: ‏[[JavaScript/Number|<integer>]] عدد البايتات المراد تخطيها قبل البدء بعملية القراءة، ويجب أن تقع قيمة هذا المعامل في المجال ‎<code>0 <= offset <= buf.length - byteLength</code>.
*<code>byteLength</code>: ‏[[JavaScript/Number|<integer>]] عدد البايتات المراد قراءتها، ويجب أن تقع قيمة هذا المعامل في المجال ‎<code>0 < byteLength <= 6</code>.
يقرأ هذا التابع الأعداد الصحيحة عديمة الإشارة ذات الحجم <code>byteLength</code> المعطى من <code>buf</code> بدءًا من البايت <code>offset</code> المعطى مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة ثمَّ يعيدها. إن كانت البتات الأقل أهميَّة مُخزَّنة أولًا (big endian)، فاستعمل <code>readUIntBE()</code>‎؛ وإن كانت البتات الأكثر أهمية مُخزَّنة أولًا (little endian)، فاستعمل <code>readUIntLE()‎</code>.


=== التابع buf.readUIntBE(offset, byteLength)‎ والتابع buf.readUIntLE(offset, byteLength)‎ ===
تفسَّر الأعداد الصحيحة المقروءة من نسخة <code>Buffer</code> على أنَّها قيم متمِّمة ثنائيًّا (two's complement) وعديمة الإشارة. تدعم هذه الدالة قراءة الأعداد الصحيحة بدقة تصل إلى 48 بت.<syntaxhighlight lang="javascript">
* offset: ‏<integer> عدد البايتات المراد تخطيها قبل البدء بعملية القراءة، ويجب أن تقع قيمة هذا المعامل في المجال ‎0 <= offset <= buf.length - byteLength.
* byteLength: ‏<integer> عدد البايتات المراد قراءتها، ويجب أن تقع قيمة هذا المعامل في المجال 0 < byteLength <= 6.
يقرأ هذا التابع الأعداد الصحيحة عديمة الإشارة ذات الحجم byteLength المعطى من buf بدءًا من البايت offset المعطى مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة ثمَّ يعيدها. إن كانت البتات الأقل أهميَّة مُخزَّنة أولًا (big endian)، فاستعمل readUIntBE()‎؛ وإن كانت البتات الأكثر أهمية مُخزَّنة أولًا (little endian)، فاستعمل readUIntLE()‎.
 
تفسَّر الأعداد الصحيحة المقروءة من نسخة Buffer على أنَّها قيم متمِّمة ثنائيًّا (two's complement) وعديمة الإشارة. تدعم هذه الدالة قراءة الأعداد الصحيحة بدقة تصل إلى 48 بت.
 
const buf = Buffer.from([0x12, 0x34, 0x56, 0x78, 0x90, 0xab]);
const buf = Buffer.from([0x12, 0x34, 0x56, 0x78, 0x90, 0xab]);


console.log(buf.readUIntBE(0, 6).toString(16));
console.log(buf.readUIntBE(0, 6).toString(16));
// Prints: 1234567890ab
// Prints: 1234567890ab
console.log(buf.readUIntLE(0, 6).toString(16));
console.log(buf.readUIntLE(0, 6).toString(16));
// Prints: ab9078563412
// Prints: ab9078563412
console.log(buf.readUIntBE(1, 6).toString(16));
console.log(buf.readUIntBE(1, 6).toString(16));
// ERR_OUT_OF_RANGE يرمى الخطأ
// ERR_OUT_OF_RANGE يرمى الخطأ


==== سجل التغييرات ====
</syntaxhighlight>
{| class="wikitable"
===<code>buf.slice([start[, end]])‎</code>===
|الإصدار
{| class="wikitable mw-collapsible"
|التغييرات
|+سجل التغييرات
!الإصدار
!التغييرات
|-
|v7.1.0 - v6.9.2
|أصبح تحويل قيمة المعامل <code>start</code> والمعامل <code>end</code> إلى أعداد صحيحة يدعم قيمًا ذات دقة أكبر من 32 بت.
|-
|-
|v10.0.0
|v7.0.0
|حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset والمعامل byteLength إلى النوع uint32 ضمنيًّا بعد الآن.
|يُحوَّل الآن المعامل <code>start</code> والمعامل <code>end</code> إلى أعداد صحيحة قبل بدء إجراء أية عمليَّة حسابيَّة عليهما.
|-
|-
|v0.11.15
|v0.3.0
|أضيف هذا التابع.
|أضيف هذا التابع.
|}
|}
*<code>start</code>: ‏[[JavaScript/Number|<integer>]] عددٌ يمثل فهرس البايت الذي يُحدَّد بداية الجزء المراد اقتطاعه من كائن <code>Buffer</code> معيَّن.
*<code>end</code>: ‏[[JavaScript/Number|<integer>]] عددٌ يمثل فهرس البايت الذي يُحدِّد نهاية الجزء المراد اقتطاعه من كائن <code>Buffer</code> معيَّن (لا يدخل هذا البايت ضمن الجزء المقتطع).
يعيد هذا التابع كائن <code>Buffer</code> جديد يتشارك جزء الذاكرة المحجوز نفسه مع الكائن <code>Buffer</code> الأصلي باستنثاء أنَّه يقتطع ذلك الجزء عبر تحديد بدايته ونهايته.


=== التابع buf.slice([start[, end]])‎ ===
إعطاء قيمة للمعامل <code>end</code> أكبر من القيمة <code>buf.length</code> سيعيد النتيجة نفسها فيما لو كانت قيمة هذا المعامل مساويةً إلى <code>buf.length</code>.
* start: ‏<integer> عددٌ يمثل فهرس البايت الذي يُحدَّد بداية الجزء المراد اقتطاعه من كائن Buffer معيَّن.
* end: ‏<integer> عددٌ يمثل فهرس البايت الذي يُحدِّد نهاية الجزء المراد اقتطاعه من كائن Buffer معيَّن (لا يدخل هذا البايت ضمن الجزء المقتطع).
يعيد هذا التابع كائن Buffer جديد يتشارك جزء الذاكرة المحجوز نفسه مع الكائن Buffer الأصلي باستنثاء أنَّه يقتطع ذلك الجزء عبر تحديد بدايته ونهايته.
 
إعطاء قيمة للمعامل end أكبر من القيمة buf.length سيعيد النتيجة نفسها فيما لو كانت قيمة هذا المعامل مساويةً إلى buf.length.
 
تعديل الكائن Buffer المقتطع سيؤدي إلى تعديل جزء الذاكرة المخصص للكائن buffer الأصلي بسبب تداخل جزء الذاكرة المحجوز لكلٍّ منهما.
 
// فيه، ثمَّ اقتطاع جزء منه، ثمَّ تعديل ASCII جديد ووضع بعض محارف Buffer إنشاء كائن


تعديل الكائن <code>Buffer</code> المقتطع سيؤدي إلى تعديل جزء الذاكرة المخصص للكائن <code>buffer</code> الأصلي بسبب تداخل جزء الذاكرة المحجوز لكلٍّ منهما.<syntaxhighlight lang="javascript">
// فيه، ثمَّ اقتطاع جزء منه، ثمَّ تعديل ASCII جديد ووضع بعض محارف Buffer إنشاء كائن
// الأصلي Buffer بايت واحد من الكائن
// الأصلي Buffer بايت واحد من الكائن


سطر 1٬616: سطر 1٬284:


for (let i = 0; i < 26; i++) {
for (let i = 0; i < 26; i++) {
 
  // ASCII في الجدول 'a' العدد 97 هو قيمة المحرف
 // ASCII في الجدول 'a' العدد 97 هو قيمة المحرف
  buf1[i] = i + 97;
 
 buf1[i] = i + 97;
 
}
}


سطر 1٬626: سطر 1٬291:


console.log(buf2.toString('ascii', 0, buf2.length));
console.log(buf2.toString('ascii', 0, buf2.length));
// abc :سيُطبع
// abc :سيُطبع


سطر 1٬632: سطر 1٬296:


console.log(buf2.toString('ascii', 0, buf2.length));
console.log(buf2.toString('ascii', 0, buf2.length));
// !bc :سيُطبع
// !bc :سيُطبع
 
</syntaxhighlight>استعمال قيمٍ سالبةٍ مع المعامل <code>start</code> أو المعامل <code>end</code> يؤدي إلى تحديد فهرس البايت -الذي يعين بداية أو نهاية الجزء المراد اقتطاعه- بدءًا من نهاية الكائن <code>buf</code> بدلًا من بدايته.<syntaxhighlight lang="javascript">
استعمال قيمٍ سالبةٍ مع المعامل start أو المعامل end يؤدي إلى تحديد فهرس البايت -الذي يعين بداية أو نهاية الجزء المراد اقتطاعه- بدءًا من نهاية الكائن buf بدلًا من بدايته.
 
const buf = Buffer.from('buffer');
const buf = Buffer.from('buffer');


console.log(buf.slice(-6, -1).toString());
console.log(buf.slice(-6, -1).toString());
// buffe :سيُطبع
// buffe :سيُطبع
// (Equivalent to buf.slice(0, 5))
// (Equivalent to buf.slice(0, 5))


console.log(buf.slice(-6, -2).toString());
console.log(buf.slice(-6, -2).toString());
// buff :سيُطبع
// buff :سيُطبع
// (Equivalent to buf.slice(0, 4))
// (Equivalent to buf.slice(0, 4))


console.log(buf.slice(-5, -2).toString());
console.log(buf.slice(-5, -2).toString());
// uff :سيُطبع
// uff :سيُطبع
// (Equivalent to buf.slice(1, 4))
// (Equivalent to buf.slice(1, 4))
 
</syntaxhighlight>
==== سجل التغييرات ====
===<code>buf.swap16()‎</code>===
{| class="wikitable"
|الإصدار
|التغييرات
|-
|v7.1.0 - v6.9.2
|أصبح تحويل قيمة المعامل start والمعامل end إلى أعداد صحيحة يدعم قيمًا ذات دقة أكبر من 32 بت.
|-
|v7.0.0
|يُحوَّل الآن المعامل start والمعامل end إلى أعداد صحيحة قبل بدء إجراء أية عمليَّة حسابيَّة عليهما.
|-
|v0.3.0
|أضيف هذا التابع.
|}
 
=== التابع buf.swap16()‎ ===
أضيف في الإصدار v5.10.0.
أضيف في الإصدار v5.10.0.


يفسِّر هذا التابع الكائن buf المُعطى على أنَّه مصفوفةٌ لأعداد صحيحة عديمة الإشارة بحجم 16 بت ويعكس ترتيب بايتي كلِّ عدد في مكانهما ثمَّ يعيد ذلك الكائن.
يفسِّر هذا التابع الكائن <code>buf</code> المُعطى على أنَّه مصفوفةٌ لأعداد صحيحة عديمة الإشارة بحجم 16 بت ويعكس ترتيب بايتي كلِّ عدد في مكانهما ثمَّ يعيد ذلك الكائن.
 
سيُرمَى الخطأ ERR_INVALID_BUFFER_SIZE إن لم تكن قيمة buf.length من مضاعفات العدد 2.


سيُرمَى الخطأ <code>ERR_INVALID_BUFFER_SIZE</code> إن لم تكن قيمة <code>buf.length</code> من مضاعفات العدد 2.<syntaxhighlight lang="javascript">
const buf1 = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8]);
const buf1 = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8]);


console.log(buf1);
console.log(buf1);
// <Buffer 01 02 03 04 05 06 07 08> :سيُطبع
// <Buffer 01 02 03 04 05 06 07 08> :سيُطبع


سطر 1٬688: سطر 1٬326:


console.log(buf1);
console.log(buf1);
// <Buffer 02 01 04 03 06 05 08 07> :سيُطبع
// <Buffer 02 01 04 03 06 05 08 07> :سيُطبع


سطر 1٬694: سطر 1٬331:


buf2.swap16();
buf2.swap16();
// ERR_INVALID_BUFFER_SIZE سيرمى الخطأ
// ERR_INVALID_BUFFER_SIZE سيرمى الخطأ
 
</syntaxhighlight>
=== التابع buf.swap32()‎ ===
===<code>buf.swap32()‎</code>===
أضيف في الإصدار v5.10.0.
أضيف في الإصدار v5.10.0.


يُفسِّر هذا التابع الكائن buf المعطى على أنَّه مصفوفةٌ لأعداد صحيحة عديمة الإشارة بحجم 32 بت ويعكس ترتيب البايتات الأربعة لكل عدد في مكانهما ثمَّ يعيد ذلك الكائن.
يُفسِّر هذا التابع الكائن <code>buf</code> المعطى على أنَّه مصفوفةٌ لأعداد صحيحة عديمة الإشارة بحجم 32 بت ويعكس ترتيب البايتات الأربعة لكل عدد في مكانهما ثمَّ يعيد ذلك الكائن.
 
سيُرمى الخطأ ERR_INVALID_BUFFER_SIZE إن لم تكن قيمة buf.length من مضاعفات العدد 4.


سيُرمى الخطأ <code>ERR_INVALID_BUFFER_SIZE</code> إن لم تكن قيمة <code>buf.length</code> من مضاعفات العدد 4.<syntaxhighlight lang="javascript">
const buf1 = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8]);
const buf1 = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8]);


console.log(buf1);
console.log(buf1);
// <Buffer 01 02 03 04 05 06 07 08> :سيُطبع
// <Buffer 01 02 03 04 05 06 07 08> :سيُطبع


سطر 1٬713: سطر 1٬347:


console.log(buf1);
console.log(buf1);
// <Buffer 04 03 02 01 08 07 06 05> :سيُطبع
// <Buffer 04 03 02 01 08 07 06 05> :سيُطبع


سطر 1٬719: سطر 1٬352:


buf2.swap32();
buf2.swap32();
// ERR_INVALID_BUFFER_SIZE سيرمى الخطأ
// ERR_INVALID_BUFFER_SIZE سيرمى الخطأ
 
</syntaxhighlight>
=== التابع buf.swap64()‎ ===
===<code>buf.swap64()‎</code>===
أضيف في الإصدار v6.3.0.
أضيف في الإصدار v6.3.0.


يُفسِّر هذا التابع الكائن buf المعطى على أنَّه مصفوفةٌ لأعداد صحيحة عديمة الإشارة بحجم 64 بت ويعكس ترتيب البايتات الأربعة لكل عدد في مكانهما ثمَّ يعيد ذلك الكائن.
يُفسِّر هذا التابع الكائن <code>buf</code> المعطى على أنَّه مصفوفةٌ لأعداد صحيحة عديمة الإشارة بحجم 64 بت ويعكس ترتيب البايتات الأربعة لكل عدد في مكانهما ثمَّ يعيد ذلك الكائن.
 
سيُرمَى الخطأ ERR_INVALID_BUFFER_SIZE إن لم تكن قيمة buf.length من مضاعفات العدد 8.


سيُرمَى الخطأ <code>ERR_INVALID_BUFFER_SIZE</code> إن لم تكن قيمة <code>buf.length</code> من مضاعفات العدد 8.<syntaxhighlight lang="javascript">
const buf1 = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8]);
const buf1 = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8]);


console.log(buf1);
console.log(buf1);
// <Buffer 01 02 03 04 05 06 07 08> :سيُطبع
// <Buffer 01 02 03 04 05 06 07 08> :سيُطبع


سطر 1٬738: سطر 1٬368:


console.log(buf1);
console.log(buf1);
// <Buffer 08 07 06 05 04 03 02 01> :سيُطبع
// <Buffer 08 07 06 05 04 03 02 01> :سيُطبع


سطر 1٬744: سطر 1٬373:


buf2.swap64();
buf2.swap64();
// ERR_INVALID_BUFFER_SIZE سيرمى الخطأ
// ERR_INVALID_BUFFER_SIZE سيرمى الخطأ
 
</syntaxhighlight>انتبه إلى أنَّ [[JavaScript]] لا تستطيع أن ترمِّز أعداد صحيحة بحجم 64 بت حاليًّا، لذا يستعمل هذا التابع مع الأعداد العشرية (floats) ذات الحجم 64 بت.
انتبه إلى أنَّ JavaScript لا تستطيع أن ترمِّز أعداد صحيحة بحجم 64 بت حاليًّا، لذا يستعمل هذا التابع مع الأعداد العشرية (floats) ذات الحجم 64 بت.
===<code>buf.toJSON()‎</code>===
 
=== التابع buf.toJSON()‎ ===
أضيف في الإصدار v0.9.2.
أضيف في الإصدار v0.9.2.


يحوِّل هذا التابع محتويات النسخة buf إلى صيغة JSON ثمَّ يعيدها في كائن من النوع Object. يستدعى هذا التابع ضمنيًّا عند استدعاء JSON.stringify()‎ لتحويل نسخة Buffer.
يحوِّل هذا التابع محتويات النسخة <code>buf</code> إلى صيغة JSON ثمَّ يعيدها في كائن من النوع <code>Object</code>. يستدعى هذا التابع ضمنيًّا عند استدعاء <code>JSON.stringify()‎</code> لتحويل نسخة <code>Buffer</code>.<syntaxhighlight lang="javascript">
 
const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
const json = JSON.stringify(buf);
const json = JSON.stringify(buf);


console.log(json);
console.log(json);
// {"type":"Buffer","data":[1,2,3,4,5]} :سيُطبع
// {"type":"Buffer","data":[1,2,3,4,5]} :سيُطبع


const copy = JSON.parse(json, (key, value) => {
const copy = JSON.parse(json, (key, value) => {
 
  return value && value.type === 'Buffer' ?
 return value && value.type === 'Buffer' ?
    Buffer.from(value.data) :
 
    value;
   Buffer.from(value.data) :
 
   value;
 
});
});


console.log(copy);
console.log(copy);
// <Buffer 01 02 03 04 05> :سيُطبع
// <Buffer 01 02 03 04 05> :سيُطبع
 
</syntaxhighlight>
=== التابع buf.toString([encoding[, start[, end]]])‎ ===
===<code>buf.toString([encoding[, start[, end]]])‎</code>===
أضيف في الإصدار v0.1.90.
أضيف في الإصدار v0.1.90.
* encoding: ‏<string> سلسلة نصية تحدِّد ترميز المحارف المراد استعماله. القيمة الافتراضيَّة هي: 'utf8'.
*<code>encoding</code>: ‏[[JavaScript/String|<string>]] سلسلة نصية تحدِّد ترميز المحارف المراد استعماله. القيمة الافتراضيَّة هي: <code>'utf8'</code>.
* start:‏ <integer> عددٌ يمثل فهرس البايت الذي ستبدأ عمليَّة فك الترميز عنده. القيمة الافتراضيَّة هي: 0.
*<code>start</code>:‏ [[JavaScript/String|<string>]] عددٌ يمثل فهرس البايت الذي ستبدأ عمليَّة فك الترميز عنده. القيمة الافتراضيَّة هي: 0.
* end: ‏<integer> عددٌ يمثل فهرس البايت الذي ستنتهي عمليَّة فك الترميز عنده (لا يدخل هذا البايت ضمن المجال). القيمة الافتراضيَّة هي: buf.length.
*<code>end</code>: ‏[[JavaScript/String|<string>]] عددٌ يمثل فهرس البايت الذي ستنتهي عمليَّة فك الترميز عنده (لا يدخل هذا البايت ضمن المجال). القيمة الافتراضيَّة هي: <code>buf.length</code>.
يفك هذا التابع ترميز كائن buf معيَّن إلى سلسلة نصية وفقًا للترميز encoding المعطى. يمكن فك ترميز جزء معيَّن فقط من buf عبر تمرير قيمةٍ للمعامل start والمعامل end.
يفك هذا التابع ترميز كائن <code>buf</code> معيَّن إلى سلسلة نصية وفقًا للترميز <code>encoding</code> المعطى. يمكن فك ترميز جزء معيَّن فقط من <code>buf</code> عبر تمرير قيمةٍ للمعامل <code>start</code> والمعامل <code>end</code>.
 
الطول الأعظمي لنسخةٍ من سلسلةٍ نصيةٍ (في واحدات الترميز UTF-16) متاحٌ عبر buffer.constants.MAX_STRING_LENGTH.


الطول الأعظمي لنسخةٍ من سلسلةٍ نصيةٍ (في واحدات الترميز UTF-16) متاحٌ عبر <code>buffer.constants.MAX_STRING_LENGTH</code>.<syntaxhighlight lang="javascript">
const buf1 = Buffer.allocUnsafe(26);
const buf1 = Buffer.allocUnsafe(26);


for (let i = 0; i < 26; i++) {
for (let i = 0; i < 26; i++) {
 
  // ASCII في الجدول 'a' العدد 97 هو قيمة المحرف
 // ASCII في الجدول 'a' العدد 97 هو قيمة المحرف
  buf1[i] = i + 97;
 
 buf1[i] = i + 97;
 
}
}


console.log(buf1.toString('ascii'));
console.log(buf1.toString('ascii'));
// abcdefghijklmnopqrstuvwxyz
// abcdefghijklmnopqrstuvwxyz
console.log(buf1.toString('ascii', 0, 5));
console.log(buf1.toString('ascii', 0, 5));
// abcde
// abcde


سطر 1٬806: سطر 1٬417:


console.log(buf2.toString('hex'));
console.log(buf2.toString('hex'));
// 74c3a97374
// 74c3a97374
console.log(buf2.toString('utf8', 0, 3));
console.log(buf2.toString('utf8', 0, 3));
// té
// té
console.log(buf2.toString(undefined, 0, 3));
console.log(buf2.toString(undefined, 0, 3));
// té
// té
 
</syntaxhighlight>
=== التابع buf.values()‎ ===
===<code>buf.values()‎</code>===
أضيف في الإصدار v1.1.0.
أضيف في الإصدار v1.1.0.


ينشئ هذا التابع مُكررًا (iterator) لقيم (بايتات) الكائن buf ثمَّ يعيده. يستدعى هذا التابع تلقائيًّا عند استعمال كائن buffer في الحلقة for..of التكرارية.
ينشئ هذا التابع مُكررًا (iterator) لقيم (بايتات) الكائن <code>buf</code> ثمَّ يعيده. يستدعى هذا التابع تلقائيًّا عند استعمال كائن <code>buffer</code> في الحلقة <code>[[JavaScript/for...of|for..of]]</code> التكرارية.<syntaxhighlight lang="javascript">
 
const buf = Buffer.from('buffer');
const buf = Buffer.from('buffer');


for (const value of buf.values()) {
for (const value of buf.values()) {
  console.log(value);
}
// :سيُطبع
//  98
//  117
//  102
//  102
//  101
//  114


 console.log(value);
for (const value of buf) {
 
  console.log(value);
}
}
// :سيُطبع
// :سيُطبع
//  98
//  117
//  102
//  102
//  101
//  114
</syntaxhighlight>
===<code>buf.write(string[, offset[, length]][, encoding])‎</code>===
أضيف في الإصدار v0.1.90.
*<code>string</code>: ‏[[JavaScript/String|<string>]] السلسلة النصية المراد كتابتها في الكائن buf.
*<code>offset</code>: ‏[[JavaScript/Number|<integer>]] عدد البايتات المراد تخطيها قبل بدء كتابة السلسلة النصية <code>string</code>. القيمة الافتراضيَّة هي: 0.
*<code>length</code>: ‏[[JavaScript/Number|<integer>]] عدد البايتات المراد كتابتها. القيمة الافتراضيَّة هي: <code>buf.length - offset</code>.
*<code>encoding</code>:‏ [[JavaScript/String|<string>]] ترميز السلسلة النصية <code>string</code> المراد كتابتها. القيمة الافتراضيَّة هي: <code>'utf8'</code>.
يكتب هذا التابع السلسلة النصية <code>string</code> المعطاة في الكائن <code>buf</code> عند البايت <code>offset</code> بعد ترميزها وفقًا للترميز <code>encoding</code> المحدَّد. يعيد بعدئذٍ عدد البايتات التي كُتبَت.


//   98
إن لم يحتوي الكائن buf على مساحة كافية تتسع السلسلة النصية <code>string</code>، فسيُكتَب قسمٌ من تلك السلسلة بحسب المساحة المتوافرة.<syntaxhighlight lang="javascript">
const buf = Buffer.alloc(256);


//   117
const len = buf.write('\u00bd + \u00bc = \u00be', 0);


//   102
console.log(`${len} bytes: ${buf.toString('utf8', 0, len)}`);
 
// 12 bytes: ½ + ¼ = ¾
//   102
</syntaxhighlight>
 
===<code>buf.writeDoubleBE(value, offset)‎</code> و <code>buf.writeDoubleLE(value, offset)</code>‎===
//   101
{| class="wikitable mw-collapsible"
 
|+سجل التغييرات
//   114
!الإصدار
!التغييرات
|-
|v10.0.0
|حذف المعامل <code>noAssert</code>، ولم يعد يُحوَّل المعامل <code>offset</code> إلى النوع <code>uint32</code> ضمنيًّا بعد الآن.
|-
|v0.11.15
|أضيف هذا التابع.
|}
*<code>value</code>: ‏[[JavaScript/Number|<number>]] عددٌ عشري مضاعف (double) بحجم 64 بت يراد كتابته في كائن <code>buf</code> معيَّن.
*<code>offset</code>: ‏[[JavaScript/Number|<number>]] عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال  ‎<code>0 <= offset <= buf.length - 8</code>.
يكتب هذا التابع قيمة المعامل <code>value</code> المعطى في <code>buf</code> بدءًا من البايت <code>offset</code> مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة. يعيد التابع بعدئذٍ عدد البايتات المكتوبة مضافًا إليه قيمة المعامل <code>offset</code>. إن كنت تريد كتابة البتات الأقل أهمية أولًا (big endian)، فاستعمل <code>writeDoubleBE()‎</code>؛ وإن كنت تريد كتابة البتات الأكثر أهمية أولًا (little endian)، فاستعمل <code>writeDoubleLE()</code>‎.


for (const value of buf) {
يجب أن يكون المعامل <code>value</code> عددًا عشريًا مضاعفًا بحجم 64 بت، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.
===<code>buf.writeFloatBE(value, offset)‎</code> و <code>buf.writeFloatLE(value, offset)‎</code>===
{| class="wikitable mw-collapsible"
|+سجل التغييرات
!الإصدار
!التغييرات
|-
|v10.0.0
|حُذف المعامل <code>noAssert</code>، ولم يعد يُحوَّل المعامل <code>offset</code> إلى النوع <code>uint32</code> ضمنيًّا بعد الآن.
|-
|v0.11.15
|أضيف هذا التابع.
|}
*<code>value</code>: ‏[[JavaScript/Number|<number>]] عددٌ عشري (float) بحجم 32 بت يراد كتابته في كائن <code>buf</code> معيَّن.
*<code>offset</code>: ‏[[JavaScript/Number|<number>]] عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال  ‎<code>0 <= offset <= buf.length - 4</code>.
يكتب هذا التابع قيمة المعامل <code>value</code> المعطى في <code>buf</code> بدءًا من البايت <code>offset</code> مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة. يعيد التابع بعدئذٍ عدد البايتات المكتوبة مضافًا إليه قيمة المعامل <code>offset</code>. إن كنت تريد كتابة البتات الأقل أهمية أولًا (big endian)، فاستعمل <code>writeFloatBE()‎</code>؛ وإن كنت تريد كتابة البتات الأكثر أهمية أولًا (little endian)، فاستعمل <code>writeFloatLE()</code>‎.


 console.log(value);
يجب أن يكون المعامل <code>value</code> عددًا عشريًا بحجم 32 بت، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.<syntaxhighlight lang="javascript">
const buf = Buffer.allocUnsafe(4);


}
buf.writeFloatBE(0xcafebabe, 0);


// :سيُطبع
console.log(buf);
// <Buffer 4f 4a fe bb> :سيُطبع


//   98
buf.writeFloatLE(0xcafebabe, 0);


//   117
console.log(buf);
// <Buffer bb fe 4a 4f> :سيُطبع


//   102
</syntaxhighlight>
===<code>buf.writeInt8(value, offset)‎</code>===
{| class="wikitable mw-collapsible"
|+سجل التغييرات
!الإصدار
!التغييرات
|-
|v10.0.0
|حذف المعامل <code>noAssert</code>، ولم يعد يُحوَّل المعامل <code>offset</code> إلى النوع <code>uint32</code> ضمنيًّا بعد الآن.
|-
|v0.5.0
|أضيف هذا التابع.
|}
*<code>value</code>: ‏[[JavaScript/Number|<number>]] عددٌ صحيح ذو إشارة (signed integer) بحجم 8 بت يراد كتابته في كائن <code>buf</code> معيَّن.
*<code>offset</code>: ‏[[JavaScript/Number|<number>]] عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال  ‎<code>0 <= offset <= buf.length - 1</code>.
يكتب هذا التابع قيمة المعامل <code>value</code> المعطى في <code>buf</code> بدءًا من البايت <code>offset</code> ثمَّ يعيد عدد البايتات المكتوبة مضافًا إليه قيمة المعامل <code>offset</code>.


//   102
يجب أن يكون المعامل <code>value</code> عددًا صحيحًا ذي إشارة بحجم 8 بت، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.


//   101
يُفسَّر العدد الصحيح المراد كتابته على أنَّه متممٌ ثنائيٌ (two's complement) وله إشارة.<syntaxhighlight lang="javascript">
const buf = Buffer.allocUnsafe(2);


//   114
buf.writeInt8(2, 0);
buf.writeInt8(-2, 1);


=== التابع buf.write(string[, offset[, length]][, encoding])‎ ===
console.log(buf);
أضيف في الإصدار v0.1.90.
// <Buffer 02 fe> :سيُطبع
* string: ‏<string> السلسلة النصية المراد كتابتها في الكائن buf.
* offset: ‏<integer> عدد البايتات المراد تخطيها قبل بدء كتابة السلسلة النصية string. القيمة الافتراضيَّة هي: 0.
* length: ‏<integer> عدد البايتات المراد كتابتها. القيمة الافتراضيَّة هي: buf.length - offset.
* encoding:‏ <string> ترميز السلسلة النصية string المراد كتابتها. القيمة الافتراضيَّة هي: 'utf8'.
يكتب هذا التابع السلسلة النصية string المعطاة في الكائن buf عند البايت offset بعد ترميزها وفقًا للترميز encoding المحدَّد. يعيد بعدئذٍ عدد البايتات التي كُتبَت.


إن لم يحتوي الكائن buf على مساحة كافية تتسع السلسلة النصية string، فسيُكتَب قسمٌ من تلك السلسلة بحسب المساحة المتوافرة.
</syntaxhighlight>
===<code>buf.writeInt16BE(value, offset)‎</code> و <code>buf.writeInt16LE(value, offset)‎</code>===
*<code>value</code>: ‏[[JavaScript/Number|<number>]] عدد صحيح ذو إشارة (signed integer) بحجم 16 بت يراد كتابته في كائن <code>buf</code> معيَّن.
*<code>offset</code>: ‏[[JavaScript/Number|<number>]] عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال  ‎<code>0 <= offset <= buf.length - 2</code>.
يكتب هذا التابع قيمة المعامل <code>value</code> المعطى في <code>buf</code> بدءًا من البايت <code>offset</code> مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة. يعيد التابع بعدئذٍ عدد البايتات المكتوبة مضافًا إليه قيمة المعامل <code>offset</code>. إن كنت تريد كتابة البتات الأقل أهمية أولًا (big endian)، فاستعمل <code>writeInt16BE()</code>‎؛ وإن كنت تريد كتابة البتات الأكثر أهمية أولًا (little endian)، فاستعمل <code>writeInt16LE()</code>‎.


const buf = Buffer.alloc(256);
يجب أن يكون المعامل value عددًا صحيحًا ذي إشارة بحجم 16 بت، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.


const len = buf.write('\u00bd + \u00bc = \u00be', 0);
يفسَّر العدد الصحيح المراد كتابته على أنَّه متممٌ ثنائيٌ (two's complement) وله إشارة.<syntaxhighlight lang="javascript">
const buf = Buffer.allocUnsafe(4);


console.log(`${len} bytes: ${buf.toString('utf8', 0, len)}`);
buf.writeInt16BE(0x0102, 0);
 
buf.writeInt16LE(0x0304, 2);
// 12 bytes: ½ + ¼ = ¾
 
=== التابع buf.writeDoubleBE(value, offset)‎ والتابع buf.writeDoubleLE(value, offset)‎ ===
* value: <number> عددٌ عشري مضاعف (double) بحجم 64 بت يراد كتابته في كائن buf معيَّن.
* offset: <integer> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال  ‎0 <= offset <= buf.length - 8.
يكتب هذا التابع قيمة المعامل value المعطى في buf بدءًا من البايت offset مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة. يعيد التابع بعدئذٍ عدد البايتات المكتوبة مضافًا إليه قيمة المعامل offset. إن كنت تريد كتابة البتات الأقل أهمية أولًا (big endian)، فاستعمل writeDoubleBE()‎؛ وإن كنت تريد كتابة البتات الأكثر أهمية أولًا (little endian)، فاستعمل writeDoubleLE()‎.
 
يجب أن يكون المعامل value عددًا عشريًا مضاعفًا بحجم 64 بت، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.
 
const buf = Buffer.allocUnsafe(8);
 
buf.writeDoubleBE(0xdeadbeefcafebabe, 0);


console.log(buf);
console.log(buf);
// <Buffer 01 02 04 03> :سيُطبع


// <Buffer 43 eb d5 b7 dd f9 5f d7> :سيُطبع
</syntaxhighlight>
 
===<code>buf.writeInt32BE(value, offset)‎</code> و <code>buf.writeInt32LE(value, offset)‎</code>===
buf.writeDoubleLE(0xdeadbeefcafebabe, 0);
{| class="wikitable mw-collapsible"
 
|+سجل التغييرات
console.log(buf);
!الإصدار
 
!التغييرات
// <Buffer d7 5f f9 dd b7 d5 eb 43> :سيُطبع
 
==== سجل التغييرات ====
{| class="wikitable"
|الإصدار
|التغييرات
|-
|-
|v10.0.0
|v10.0.0
|حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
|حذف المعامل <code>noAssert</code>، ولم يعد يُحوَّل المعامل <code>offset</code> إلى النوع <code>uint32</code> ضمنيًّا بعد الآن.
|-
|-
|v0.11.15
|v0.5.5
|أضيف هذا التابع.
|أضيف هذا التابع.
|}
|}
*<code>value</code>:‏ [[JavaScript/Number|<number>]] عددٌ صحيحٌ ذو إشارة (signed integer) بحجم 32 بت يراد كتابته في كائن <code>buf</code> معيَّن.
*<code>offset</code>: ‏[[JavaScript/Number|<number>]] عدد البايتات المراد تخطيها قبل البدء بعملية القراءة. ويجب أن تقع القيمة المعطاة بين المجال ‎<code>0 <= offset <= buf.length - 4</code>.
يكتب هذا التابع قيمة المعامل <code>value</code> المعطى في <code>buf</code> بدءًا من البايت <code>offset</code> مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة. يعيد التابع بعدئذٍ عدد البايتات المكتوبة مضافًا إليه قيمة المعامل <code>offset</code>. إن كنت تريد كتابة البتات الأقل أهمية أولًا (big endian)، فاستعمل <code>writeInt32BE()</code>‎؛ وإن كنت تريد كتابة البتات الأكثر أهمية أولًا (little endian)، فاستعمل <code>writeInt32LE()</code>‎.


=== التابع buf.writeFloatBE(value, offset)‎ والتابع buf.writeFloatLE(value, offset)‎ ===
يجب أن يكون المعامل <code>value</code> عددًا صحيحًا ذي إشارة بحجم 32 بت، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.
* value: ‏<number> عددٌ عشري (float) بحجم 32 بت يراد كتابته في كائن buf معيَّن.
* offset: ‏<integer> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال  ‎0 <= offset <= buf.length - 4.
يكتب هذا التابع قيمة المعامل value المعطى في buf بدءًا من البايت offset مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة. يعيد التابع بعدئذٍ عدد البايتات المكتوبة مضافًا إليه قيمة المعامل offset. إن كنت تريد كتابة البتات الأقل أهمية أولًا (big endian)، فاستعمل writeFloatBE()‎؛ وإن كنت تريد كتابة البتات الأكثر أهمية أولًا (little endian)، فاستعمل writeFloatLE()‎.


يجب أن يكون المعامل value عددًا عشريًا بحجم 32 بت، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.
يفسَّر العدد الصحيح المراد كتابته على أنَّه متممٌ ثنائيٌ (two's complement) وله إشارة.<syntaxhighlight lang="javascript">
const buf = Buffer.allocUnsafe(8);


const buf = Buffer.allocUnsafe(4);
buf.writeInt32BE(0x01020304, 0);
 
buf.writeInt32LE(0x05060708, 4);
buf.writeFloatBE(0xcafebabe, 0);


console.log(buf);
console.log(buf);
// <Buffer 01 02 03 04 08 07 06 05> :سيُطبع


// <Buffer 4f 4a fe bb> :سيُطبع
</syntaxhighlight>
 
===<code>buf.writeIntBE(value, offset, byteLength)‎</code> و <code>buf.writeIntLE(value, offset, byteLength)‎</code>===
buf.writeFloatLE(0xcafebabe, 0);
{| class="wikitable mw-collapsible"
 
|+سجل التغييرات
console.log(buf);
!الإصدار
 
!التغييرات
// <Buffer bb fe 4a 4f> :سيُطبع
 
==== سجل التغييرات ====
{| class="wikitable"
|الإصدار
|التغييرات
|-
|-
|v10.0.0
|v10.0.0
|حُذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
|حذف المعامل <code>noAssert</code>، ولم يعد يُحوَّل المعامل <code>offset</code> إلى النوع <code>uint32</code> ضمنيًّا بعد الآن.
|-
|-
|v0.11.15
|v0.11.15
|أضيف هذا التابع.
|أضيف هذا التابع.
|}
|}
*<code>value</code>: ‏[[JavaScript/Number|<number>]] عددٌ صحيحٌ ذو إشارة (signed integer) يراد كتابته في كائن <code>buf</code> معيَّن.
*<code>offset</code>: ‏[[JavaScript/Number|<number>]] عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال ‎<code>0 <= offset <= buf.length - byteLength</code>.
*<code>byteLength</code>: ‏[[JavaScript/Number|<integer>]] عدد البايتات المراد كتابتها. يجب أن تقع قيمة هذا المعامل في المجال ‎<code>0 < byteLength <= 6</code>.
يكتب هذا التابع عددًا محددًا من بايتات المعامل <code>value</code> المعطى في <code>buf</code> بدءًا من البايت <code>offset</code> ثمَّ يعيد عدد البايتات المكتوبة مضافًا إليه قيمة المعامل <code>offset</code>.


=== التابع buf.writeInt8(value, offset)‎ ===
يدعم هذا التابع الأعداد الصحيحة ذات الإشارة بدقة تصل إلى 48 بت. يجب أن يكون المعامل <code>value</code> عددًا صحيحًا ذي إشارة، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.<syntaxhighlight lang="javascript">
* value: ‏<number> عددٌ صحيح ذو إشارة (signed integer) بحجم 8 بت يراد كتابته في كائن buf معيَّن.
const buf = Buffer.allocUnsafe(6);
* offset: ‏<integer> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال  ‎0 <= offset <= buf.length - 1.
يكتب هذا التابع قيمة المعامل value المعطى في buf بدءًا من البايت offset ثمَّ يعيد عدد البايتات المكتوبة مضافًا إليه قيمة المعامل offset.


يجب أن يكون المعامل value عددًا صحيحًا ذي إشارة بحجم 8 بت، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.
buf.writeIntBE(0x1234567890ab, 0, 6);


يُفسَّر العدد الصحيح المراد كتابته على أنَّه متممٌ ثنائيٌ (two's complement) وله إشارة.
console.log(buf);
// <Buffer 12 34 56 78 90 ab> :سيُطبع


const buf = Buffer.allocUnsafe(2);
buf.writeIntLE(0x1234567890ab, 0, 6);


buf.writeInt8(2, 0);
console.log(buf);
// <Buffer ab 90 78 56 34 12> :سيُطبع


buf.writeInt8(-2, 1);
</syntaxhighlight>
 
===<code>buf.writeUInt8(value, offset)‎</code>===
console.log(buf);
{| class="wikitable mw-collapsible"
 
|+سجل التغييرات
// <Buffer 02 fe> :سيُطبع
!الإصدار
 
!التغييرات
==== سجل التغييرات ====
{| class="wikitable"
|الإصدار
|التغييرات
|-
|-
|v10.0.0
|v10.0.0
|حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
|حذف المعامل <code>noAssert</code>، ولم يعد يُحوَّل المعامل <code>offset</code> إلى النوع <code>uint32</code> ضمنيًّا بعد الآن.
|-
|-
|v0.5.0
|v0.5.0
|أضيف هذا التابع.
|أضيف هذا التابع.
|}
|}
*<code>value</code>: ‏[[JavaScript/Number|<number>]] عددٌ صحيحٌ عديم الإشارة (unsigned integer) بحجم 8 بت يراد كتابته في كائن <code>buf</code> معيَّن.
*offset: ‏[[JavaScript/Number|<number>]] عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال ‎<code>0 <= offset <= buf.length - 1</code>.
يكتب هذا التابع قيمة المعامل <code>value</code> المعطى في <code>buf</code> بدءًا من البايت <code>offset</code> ثمَّ يعيد عدد البايتات المكتوبة مضافًا إليه قيمة المعامل <code>offset</code>.


=== التابع buf.writeInt16BE(value, offset)‎ والتابع buf.writeInt16LE(value, offset)‎ ===
يجب أن يكون المعامل <code>value</code> عددًا صحيحًا عديم الإشارة بحجم 8 بت، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.<syntaxhighlight lang="javascript">
* value: ‏<number> عدد صحيح ذو إشارة (signed integer) بحجم 16 بت يراد كتابته في كائن buf معيَّن.
* offset: ‏<integer> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال  ‎0 <= offset <= buf.length - 2.
يكتب هذا التابع قيمة المعامل value المعطى في buf بدءًا من البايت offset مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة. يعيد التابع بعدئذٍ عدد البايتات المكتوبة مضافًا إليه قيمة المعامل offset. إن كنت تريد كتابة البتات الأقل أهمية أولًا (big endian)، فاستعمل writeInt16BE()‎؛ وإن كنت تريد كتابة البتات الأكثر أهمية أولًا (little endian)، فاستعمل writeInt16LE()‎.
 
يجب أن يكون المعامل value عددًا صحيحًا ذي إشارة بحجم 16 بت، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.
 
يفسَّر العدد الصحيح المراد كتابته على أنَّه متممٌ ثنائيٌ (two's complement) وله إشارة.
 
const buf = Buffer.allocUnsafe(4);
const buf = Buffer.allocUnsafe(4);


buf.writeInt16BE(0x0102, 0);
buf.writeUInt8(0x3, 0);
 
buf.writeUInt8(0x4, 1);
buf.writeInt16LE(0x0304, 2);
buf.writeUInt8(0x23, 2);
buf.writeUInt8(0x42, 3);


console.log(buf);
console.log(buf);
// <Buffer 03 04 23 42> :سيُطبع


// <Buffer 01 02 04 03> :سيُطبع
</syntaxhighlight>
 
===<code>buf.writeUInt16BE(value, offset)‎</code> و <code>buf.writeUInt16LE(value, offset)‎</code>===
==== سجل التغييرات ====
{| class="wikitable"
{| class="wikitable"
|الإصدار
!الإصدار
|التغييرات
!التغييرات
|-
|-
|v10.0.0
|v10.0.0
|حذف المعامل noAssert، ولم يعد يحول المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
|حذف المعامل <code>noAssert</code>، ولم يعد يُحوَّل المعامل <code>offset</code> إلى النوع <code>uint32</code> ضمنيًّا بعد الآن.
|-
|-
|v0.5.5
|v0.5.5
|أضيف هذا التابع.
|أضيف هذا التابع.
|}
|}
*<code>value</code>: ‏[[JavaScript/Number|<number>]] عددٌ صحيحٌ عديم الإشارة (unsigned integer) بحجم 16 بت يراد كتابته في كائن <code>buf</code> معين.
*<code>offset</code>: ‏[[JavaScript/Number|<number>]] عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال ‎<code>0 <= offset <= buf.length - 2</code>.
يكتب هذا التابع قيمة المعامل <code>value</code> المعطى في <code>buf</code> بدءًا من البايت <code>offset</code> مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة. يعيد التابع بعدئذٍ عدد البايتات المكتوبة مضافًا إليه قيمة المعامل <code>offset</code>. إن كنت تريد كتابة البتات الأقل أهمية أولًا (big endian)، فاستعمل <code>writeUInt16BE()</code>‎؛ وإن كنت تريد كتابة البتات الأكثر أهمية أولًا (little endian)، فاستعمل <code>writeUInt16LE()</code>‎.


=== التابع buf.writeInt32BE(value, offset)‎ والتابع buf.writeInt32LE(value, offset)‎ ===
يجب أن يكون المعامل <code>value</code> عددًا صحيحًا عديم الإشارة بحجم 16 بت، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.<syntaxhighlight lang="javascript">
* value:‏ <number> عددٌ صحيحٌ ذو إشارة (signed integer) بحجم 32 بت يراد كتابته في كائن buf معيَّن.
const buf = Buffer.allocUnsafe(4);
* offset: ‏<integer> عدد البايتات المراد تخطيها قبل البدء بعملية القراءة. ويجب أن تقع القيمة المعطاة بين المجال ‎0 <= offset <= buf.length - 4.
يكتب هذا التابع قيمة المعامل value المعطى في buf بدءًا من البايت offset مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة. يعيد التابع بعدئذٍ عدد البايتات المكتوبة مضافًا إليه قيمة المعامل offset. إن كنت تريد كتابة البتات الأقل أهمية أولًا (big endian)، فاستعمل writeInt32BE()‎؛ وإن كنت تريد كتابة البتات الأكثر أهمية أولًا (little endian)، فاستعمل writeInt32LE()‎.


يجب أن يكون المعامل value عددًا صحيحًا ذي إشارة بحجم 32 بت، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.
buf.writeUInt16BE(0xdead, 0);
buf.writeUInt16BE(0xbeef, 2);


يفسَّر العدد الصحيح المراد كتابته على أنَّه متممٌ ثنائيٌ (two's complement) وله إشارة.
console.log(buf);
// <Buffer de ad be ef> :سيُطبع


const buf = Buffer.allocUnsafe(8);
buf.writeUInt16LE(0xdead, 0);
 
buf.writeUInt16LE(0xbeef, 2);
buf.writeInt32BE(0x01020304, 0);
 
buf.writeInt32LE(0x05060708, 4);


console.log(buf);
console.log(buf);
// <Buffer ad de ef be> :سيُطبع


// <Buffer 01 02 03 04 08 07 06 05> :سيُطبع
</syntaxhighlight>
 
===<code>buf.writeUInt32BE(value, offset)‎</code> و <code>buf.writeUInt32LE(value, offset)‎</code>===
==== سجل التغييرات ====
{| class="wikitable"
{| class="wikitable"
|الإصدار
!الإصدار
|التغييرات
!التغييرات
|-
|-
|v10.0.0
|v10.0.0
|حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
|حذف المعامل <code>noAssert</code>، ولم يعد يُحوَّل المعامل <code>offset</code> إلى النوع <code>uint32</code> ضمنيًّا بعد الآن.
|-
|-
|v0.5.5
|v0.5.5
|أضيف هذا التابع.
|أضيف هذا التابع.
|}
|}
*<code>value</code>: ‏[[JavaScript/Number|<number>]] عددٌ صحيحٌ عديم الإشارة (unsigned integer) بحجم 32 بت يراد كتابته في كائن <code>buf</code> معيَّن.
*<code>offset</code>: ‏[[JavaScript/Number|<number>]] عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال ‎<code>0 <= offset <= buf.length - 4</code>.
يكتب هذا التابع قيمة المعامل <code>value</code> المعطى في <code>buf</code> بدءًا من البايت <code>offset</code> مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة. يعيد التابع بعدئذٍ عدد البايتات المكتوبة مضافًا إليه قيمة المعامل <code>offset</code>. إن كنت تريد كتابة البتات الأقل أهمية أولًا (big endian)، فاستعمل <code>writeUInt32BE()</code>‎؛ وإن كنت تريد كتابة البتات الأكثر أهمية أولًا (little endian)، فاستعمل <code>writeUInt32LE()‎</code>.


=== التابع buf.writeIntBE(value, offset, byteLength)‎ ===
يجب أن يكون المعامل <code>value</code> عددًا صحيحًا عديم الإشارة بحجم 32 بت، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.<syntaxhighlight lang="javascript">
const buf = Buffer.allocUnsafe(4);


=== والتابع buf.writeIntLE(value, offset, byteLength)‎ ===
buf.writeUInt32BE(0xfeedface, 0);
* value: ‏<number> عددٌ صحيحٌ ذو إشارة (signed integer) يراد كتابته في كائن buf معيَّن.
* offset: ‏<integer> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال ‎0 <= offset <= buf.length - byteLength.
* byteLength: ‏<integer> عدد البايتات المراد كتابتها. يجب أن تقع قيمة هذا المعامل في المجال ‎0 < byteLength <= 6.
يكتب هذا التابع عددًا محددًا من بايتات المعامل value المعطى في buf بدءًا من البايت offset ثمَّ يعيد عدد البايتات المكتوبة مضافًا إليه قيمة المعامل offset.


يدعم هذا التابع الأعداد الصحيحة ذات الإشارة بدقة تصل إلى 48 بت. يجب أن يكون المعامل value عددًا صحيحًا ذي إشارة، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.
console.log(buf);
// <Buffer fe ed fa ce> :سيُطبع


const buf = Buffer.allocUnsafe(6);
buf.writeUInt32LE(0xfeedface, 0);


buf.writeIntBE(0x1234567890ab, 0, 6);
console.log(buf);
// <Buffer ce fa ed fe> :سيُطبع


console.log(buf);
</syntaxhighlight>
 
===<code>buf.writeUIntBE(value, offset, byteLength)‎</code> و <code>buf.writeUIntLE(value, offset, byteLength)</code>===
// <Buffer 12 34 56 78 90 ab> :سيُطبع
 
buf.writeIntLE(0x1234567890ab, 0, 6);
 
console.log(buf);
 
// <Buffer ab 90 78 56 34 12> :سيُطبع
 
==== سجل التغييرات ====
{| class="wikitable"
{| class="wikitable"
|الإصدار
!الإصدار
|التغييرات
!التغييرات
|-
|-
|v10.0.0
|v10.0.0
|حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
|حذف المعامل <code>noAssert</code>، ولم يعد يُحوَّل المعامل <code>offset</code> إلى النوع <code>uint32</code> ضمنيًّا بعد الآن.
|-
|-
|v0.11.15
|v0.5.5
|أضيف هذا التابع.
|أضيف هذا التابع.
|}
|}
*<code>value</code>: ‏[[JavaScript/Number|<number>]] عددٌ صحيحٌ عديم الإشارة (unsigned integer) يراد كتابته في كائن <code>buf</code> معيَّن.
*<code>offset</code>: ‏[[JavaScript/Number|<number>]] عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال ‎<code>0 <= offset <= buf.length - byteLength</code>.
*<code>byteLength</code>: ‏[[JavaScript/Number|<integer>]] عدد البايتات المراد كتابتها. يجب أن تقع قيمة هذا المعامل في المجال ‎<code>0 < byteLength <= 6</code>.
يكتب هذا التابع عددًا محددًا من بايتات المعامل <code>value</code> المعطى في <code>buf</code> بدءًا من البايت <code>offset</code> ثمَّ يعيد عدد البايتات المكتوبة مضافًا إليه قيمة المعامل <code>offset</code>.


=== التابع buf.writeUInt8(value, offset)‎ ===
يدعم هذا التابع الأعداد الصحيحة عديمة الإشارة بدقة تصل إلى 48 بت. يجب أن يكون المعامل <code>value</code> عددًا صحيحًا عديم الإشارة، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.<syntaxhighlight lang="javascript">
* value: ‏<number> عددٌ صحيحٌ عديم الإشارة (unsigned integer) بحجم 8 بت يراد كتابته في كائن buf معيَّن.
const buf = Buffer.allocUnsafe(6);
* offset: ‏<integer> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال ‎0 <= offset <= buf.length - 1.
يكتب هذا التابع قيمة المعامل value المعطى في buf بدءًا من البايت offset ثمَّ يعيد عدد البايتات المكتوبة مضافًا إليه قيمة المعامل offset.


يجب أن يكون المعامل value عددًا صحيحًا عديم الإشارة بحجم 8 بت، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.
buf.writeUIntBE(0x1234567890ab, 0, 6);


const buf = Buffer.allocUnsafe(4);
console.log(buf);
// <Buffer 12 34 56 78 90 ab> :سيُطبع


buf.writeUInt8(0x3, 0);
buf.writeUIntLE(0x1234567890ab, 0, 6);


buf.writeUInt8(0x4, 1);
console.log(buf);
// <Buffer ab 90 78 56 34 12> :سيُطبع


buf.writeUInt8(0x23, 2);
</syntaxhighlight>
==الخاصية <code>buffer.INSPECT_MAX_BYTES</code>==
أضيفت في الإصدار v0.5.4.


buf.writeUInt8(0x42, 3);
تعيد هذه الخاصِّيَّة عدد البايتات الأعظمي التي سيُعاد عند استدعاء <code>buf.inspect()‎</code>. القيمة الافتراضيَّة هي: 50. يمكن أن يُستبدَل هذا العدد من طرف وحدات المستخدم. ارجع إلى <code>util.inspect()‎</code> لتفاصيل أوسع حول سلوك التابع <code>buf.inspect()‎</code>.


console.log(buf);
انتبه إلى أنَّ هذه الخاصِّيًّة هي خاصِّيَّةٌ في الوحدة <code>Buffer</code> تُعاد عبر <code>require('buffer')</code>‎ وليست في <code>Buffer</code> العام أو نسخة <code>Buffer</code>.
==الخاصية <code>buffer.kMaxLength</code>==
أضيفت في الإصدار v3.0.0.


// <Buffer 03 04 23 42> :سيُطبع
تعيد هذه الخاصِّيًّة عددًا يمثل أكبر حجم مسموح لنسخة <code>Buffer</code> واحدة، وهي اسم بديل للخاصِّيَّة <code>buffer.constants.MAX_LENGTH</code>.


==== سجل التغييرات ====
انتبه إلى أنَّ هذه الخاصِّيًّة هي خاصِّيَّةٌ في الوحدة <code>Buffer</code> تُعاد عبر <code>require('buffer')</code>‎ وليست في <code>Buffer</code> العام أو نسخة <code>Buffer</code>.
{| class="wikitable"
==التابع <code>buffer.transcode(source, fromEnc, toEnc)</code>==
|الإصدار
{| class="wikitable mw-collapsible"
|التغييرات
|+سجل التغييرات
!الإصدار
!التغيير
|-
|-
|v10.0.0
|v8.0.0
|حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
|يمكن أن يكون المعامل <code>source</code> الآن نسخةً من النوع <code>Uint8Array</code>.
|-
|-
|v0.5.0
|v7.1.0
|أضيف هذا التابع.
|أضيف هذا التابع.
|}
|}
*<code>source</code>: ‏<Buffer> | <Uint8Array> نسخةٌ من <code>Buffer</code> أو <code>Uint8Array</code>.
*<code>fromEnc</code>: ‏[[JavaScript/String|<string>]] الترميز الحالي.
*<code>toEnc</code>: ‏[[JavaScript/String|<string>]] الترميز المراد التحويل إليه.
تغير هذه الدالة ترميز نسخة <code>Buffer</code> أو <code>Uint8Array</code> المعطية من ترميز إلى آخر ثمَّ تضع الناتج في نسخة <code>Buffer</code> جديدة وتعيدها.


=== التابع buf.writeUInt16BE(value, offset)‎ والتابع buf.writeUInt16LE(value, offset)‎ ===
سيُرمى خطأ إن كان الترميز <code>fromEnc</code> أو الترميز <code>toEnc</code> غير مدعوم أو غير صحيح أو إن لم يكن مسموحًا بالتحويل من الترميز <code>fromEnc</code> إلى الترميز <code>toEnc</code>.
* value: ‏<number> عددٌ صحيحٌ عديم الإشارة (unsigned integer) بحجم 16 بت يراد كتابته في كائن buf معين.
* offset: ‏<integer> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال ‎0 <= offset <= buf.length - 2.
يكتب هذا التابع قيمة المعامل value المعطى في buf بدءًا من البايت offset مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة. يعيد التابع بعدئذٍ عدد البايتات المكتوبة مضافًا إليه قيمة المعامل offset. إن كنت تريد كتابة البتات الأقل أهمية أولًا (big endian)، فاستعمل writeUInt16BE()‎؛ وإن كنت تريد كتابة البتات الأكثر أهمية أولًا (little endian)، فاستعمل writeUInt16LE()‎.


يجب أن يكون المعامل value عددًا صحيحًا عديم الإشارة بحجم 16 بت، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.
ستَستعمل عمليَّة التحويل التي تجريها هذه الدالة محارف بديلة إن لم يكن بالإمكان تمثيل أحد البايتات المعطية على نحو ملائم في الترميز المراد التحويل إليه. إليك هذه الشيفرة مثلًا التي تشرح ذلك:<syntaxhighlight lang="javascript">
const buffer = require('buffer');


const buf = Buffer.allocUnsafe(4);
const newBuf = buffer.transcode(Buffer.from('€'), 'utf8', 'ascii');
console.log(newBuf.toString('ascii'));
// '?' :سيُطبع
</syntaxhighlight>لمَّا كان المحرف € غير قابل للتمثيل في الترميز US-ASCII، فاستُبدِل به المحرف ? في النسخة <code>Buffer</code> المحولة إلى ذلك الترميز.


buf.writeUInt16BE(0xdead, 0);
انتبه إلى أنَّ هذه الخاصِّيَّة هي خاصِّيَّةٌ في الوحدة <code>Buffer</code> تُعاد عبر <code>require('buffer')</code>‎ وليست في <code>Buffer</code> العام أو نسخة <code>Buffer</code>.
==الصنف <code>SlowBuffer</code>==
أهمل في الإصدار v6.0.0.


buf.writeUInt16BE(0xbeef, 2);
الاستقرار: 0-مهمل: استعمل <code>Buffer.allocUnsafeSlow()‎</code> عوضًا عنه.


console.log(buf);
يستعمل هذا الصنف لإنشاء نسخة <code>Buffer</code> تقع خارج المُجمِّع (pool) المحجوز مسبقًا.


// <Buffer de ad be ef> :سيُطبع
عند إنشاء نسخ جديدة من <code>Buffer</code>، تُقتَطَع بشكل افتراضي حجوزات الذاكرة التي تقل عن 4 كيلوبايت من نسخة <code>Buffer</code> واحدة محجوزة مسبقًا. هذا يساعد التطبيقات على تجنب زيادة مجمَّع المهملات (garbage allocation) عبر تقليل إنشاء نسخ <code>Buffer</code> جديدة وحجز أجزاء من الذاكرة بشكل فردي. يحسِّن ذلك الأداء واستخدام الذاكرة عبر تقليل الحاجة إلى تتبُّع وإزالة أقل قدر ممكن من الكائنات الموجودة والمتكرِّرة.


buf.writeUInt16LE(0xdead, 0);
مع ذلك، في حال احتاج المطور إلى الاحتفاظ يجزءٍ صغيرٍ من الذاكرة يقع في المجمِّع (pool) المحجوز مسبقًا لفترة زمنية غير معلومة، فيُستحسَن إنشاء نسخة <code>Buffer</code> بحجز جزء آخر من الذاكر يقع خارج مجمِّع الذاكرة المحجوز مسبقًا (un-pooled) عبر استعمال <code>SlowBuffer</code> ثمَّ نسخ البيانات التي تريد الاحتفاظ بها إليها.<syntaxhighlight lang="javascript">
// الحاجة إلى الاحتفاظ ببعض أجزاء الذاكرة
const store = [];


buf.writeUInt16LE(0xbeef, 2);
socket.on('readable', () => {
  const sb = SlowBuffer(10);


console.log(buf);
  // حجز جزء من الذاكرة خاص بالبيانات المراد الاحتفاظ بها
  const sb = Buffer.allocUnsafeSlow(10);


// <Buffer ad de ef be> :سيُطبع
  // نسخ البيانات إلى موقع جديد
  data.copy(sb, 0, 0, 10);


==== سجل التغييرات ====
  store.push(sb);
{| class="wikitable"
});
|الإصدار
</syntaxhighlight>يجب عدم اللجوء إلى استعمال الصنف <code>SlowBuffer</code> إلا في نهاية المطاف بعد أن يلاحظ المطور نفسه أنه احتفظ بأجزاء من الذاكرة لا حاجة له فيها في تطبيقه.
|التغييرات
===<code>new SlowBuffer(size)‎</code>===
|-
أهملت في الإصدار v6.0.0.
|v10.0.0
|حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
|-
|v0.5.5
|أضيف هذا التابع.
|}


=== التابع buf.writeUInt32BE(value, offset)‎ والتابع buf.writeUInt32LE(value, offset)‎ ===
الاستقرار: 0-مهمل: استعمل التابع <code>Buffer.allocUnsafeSlow()‎</code> عوضًا عن هذه الدالة.
* value: ‏<number> عددٌ صحيحٌ عديم الإشارة (unsigned integer) بحجم 32 بت يراد كتابته في كائن buf معيَّن.
*<code>size</code>: ‏[[JavaScript/Number|<integer>]] حجم الذاكرة المراد حجزه للنسخة <code>Buffer</code> المنشأة.
* offset: ‏<integer> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال ‎0 <= offset <= buf.length - 4.
تنشئ هذه الدالة نسخة <code>Buffer</code> جديدة وتحجز لها من الذاكرة الحجم <code>size</code> المعطى. إن كانت قيمة المعامل <code>size</code> المعطاة أكبر من <code>buffer.constants.MAX_LENGTH</code> أو أصغر من الصفر، فسيُرمى الخطأ <code>ERR_INVALID_OPT_VALUE</code>. الجدير بالذكر أنَّه تنشأ النسخة <code>Buffer</code> إن أعطيت القيمة 0 للمعامل <code>size</code>.
يكتب هذا التابع قيمة المعامل value المعطى في buf بدءًا من البايت offset مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة. يعيد التابع بعدئذٍ عدد البايتات المكتوبة مضافًا إليه قيمة المعامل offset. إن كنت تريد كتابة البتات الأقل أهمية أولًا (big endian)، فاستعمل writeUInt32BE()‎؛ وإن كنت تريد كتابة البتات الأكثر أهمية أولًا (little endian)، فاستعمل writeUInt32LE()‎.


يجب أن يكون المعامل value عددًا صحيحًا عديم الإشارة بحجم 32 بت، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.
انتبه إلى أنَّ هذه الدالة لا تهيئ الذاكرة التي تحجزها عند استعمالها لإنشاء نسخٍ من <code>Buffer</code>. نتيجةً لذلك، لا يُعرَف المحتوى الأولي للنسخة <code>Buffer</code> المنشأة آنذاك وقد يحوي بعض البيانات الحسَّاسة التي كتبت على تلك الذاكرة مسبقًا. إن أردت تهيئة جزء الذاكرة المحجوز ووضع قيمة أولية معروفة فيه، فاستعمل التابع <code>buf.fill()‎</code>.<syntaxhighlight lang="javascript">
const { SlowBuffer } = require('buffer');


const buf = Buffer.allocUnsafe(4);
const buf = new SlowBuffer(5);
 
buf.writeUInt32BE(0xfeedface, 0);


console.log(buf);
console.log(buf);
// <Buffer 78 e0 82 02 01> :سيُطبع شيء شبيه بهذا


// <Buffer fe ed fa ce> :سيُطبع
buf.fill(0);
 
buf.writeUInt32LE(0xfeedface, 0);


console.log(buf);
console.log(buf);
 
// <Buffer 00 00 00 00 00> :سيُطبع
// <Buffer ce fa ed fe> :سيُطبع
</syntaxhighlight>
 
==ثوابت <code>Buffer</code>==
==== سجل التغييرات ====
{| class="wikitable"
|الإصدار
|التغييرات
|-
|v10.0.0
|حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
|-
|v0.5.5
|أضيف هذا التابع.
|}
 
=== التابع buf.writeUIntBE(value, offset, byteLength)‎ ===
 
=== والتابع buf.writeUIntLE(value, offset, byteLength)‎ ===
* value: ‏<number> عددٌ صحيحٌ عديم الإشارة (unsigned integer) يراد كتابته في كائن buf معيَّن.
* offset: ‏<integer> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال ‎0 <= offset <= buf.length - byteLength.
* byteLength: ‏<integer> عدد البايتات المراد كتابتها. يجب أن تقع قيمة هذا المعامل في المجال ‎0 < byteLength <= 6.
يكتب هذا التابع عددًا محددًا من بايتات المعامل value المعطى في buf بدءًا من البايت offset ثمَّ يعيد عدد البايتات المكتوبة مضافًا إليه قيمة المعامل offset.
 
يدعم هذا التابع الأعداد الصحيحة عديمة الإشارة بدقة تصل إلى 48 بت. يجب أن يكون المعامل value عددًا صحيحًا عديم الإشارة، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.
 
const buf = Buffer.allocUnsafe(6);
 
buf.writeUIntBE(0x1234567890ab, 0, 6);
 
console.log(buf);
 
// <Buffer 12 34 56 78 90 ab> :سيُطبع
 
buf.writeUIntLE(0x1234567890ab, 0, 6);
 
console.log(buf);
 
// <Buffer ab 90 78 56 34 12> :سيُطبع
 
==== سجل التغييرات ====
{| class="wikitable"
|الإصدار
|التغييرات
|-
|v10.0.0
|حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
|-
|v0.5.5
|أضيف هذا التابع.
|}
 
== الخاصية buffer.INSPECT_MAX_BYTES ==
أضيفت في الإصدار v0.5.4.
 
تعيد هذه الخاصِّيَّة عدد البايتات الأعظمي التي سيُعاد عند استدعاء buf.inspect()‎. القيمة الافتراضيَّة هي: 50. يمكن أن يُستبدَل هذا العدد من طرف وحدات المستخدم. ارجع إلى util.inspect()‎ لتفاصيل أوسع حول سلوك التابع buf.inspect()‎.
 
انتبه إلى أنَّ هذه الخاصِّيًّة هي خاصِّيَّةٌ في الوحدة Buffer تُعاد عبر require('buffer')‎ وليست في Buffer العام أو نسخة Buffer.
 
== الخاصية buffer.kMaxLength ==
أضيفت في الإصدار v3.0.0.
 
تعيد هذه الخاصِّيًّة عددًا يمثل أكبر حجم مسموح لنسخة Buffer واحدة، وهي اسم بديل للخاصِّيَّة buffer.constants.MAX_LENGTH.
 
انتبه إلى أنَّ هذه الخاصِّيًّة هي خاصِّيَّةٌ في الوحدة Buffer تُعاد عبر require('buffer')‎ وليست في Buffer العام أو نسخة Buffer.
 
== التابع buffer.transcode(source, fromEnc, toEnc)‎ ==
* source: ‏<Buffer> | <Uint8Array> نسخةٌ من Buffer أو Uint8Array.
* fromEnc: ‏<string> الترميز الحالي.
* toEnc: ‏<string> الترميز المراد التحويل إليه.
تغير هذه الدالة ترميز نسخة Buffer أو Uint8Array المعطية من ترميز إلى آخر ثمَّ تضع الناتج في نسخة Buffer جديدة وتعيدها.
 
سيُرمى خطأ إن كان الترميز fromEnc أو الترميز toEnc غير مدعوم أو غير صحيح أو إن لم يكن مسموحًا بالتحويل من الترميز fromEnc إلى الترميز toEnc.
 
ستَستعمل عمليَّة التحويل التي تجريها هذه الدالة محارف بديلة إن لم يكن بالإمكان تمثيل أحد البايتات المعطية على نحو ملائم في الترميز المراد التحويل إليه. إليك هذه الشيفرة مثلًا التي تشرح ذلك:
 
const buffer = require('buffer');
 
const newBuf = buffer.transcode(Buffer.from('€'), 'utf8', 'ascii');
 
console.log(newBuf.toString('ascii'));
 
// '?' :سيُطبع
 
لمَّا كان المحرف € غير قابل للتمثيل في الترميز US-ASCII، فاستُبدِل به المحرف ? في النسخة Buffer المحولة إلى ذلك الترميز.
 
انتبه إلى أنَّ هذه الخاصِّيَّة هي خاصِّيَّةٌ في الوحدة Buffer تُعاد عبر require('buffer')‎ وليست في Buffer العام أو نسخة Buffer.
 
=== سجل التغييرات ===
{| class="wikitable"
|الإصدار
|التغيير
|-
|v8.0.0
|يمكن أن يكون المعامل source الآن نسخةً من النوع Uint8Array.
|-
|v7.1.0
|أضيف هذا التابع.
|}
 
== الصنف SlowBuffer ==
أهمل في الإصدار v6.0.0.
 
الاستقرار: 0-مهمل: استعمل Buffer.allocUnsafeSlow() عوضًا عنه.
 
يستعمل هذا الصنف لإنشاء نسخة Buffer تقع خارج المُجمِّع (pool) المحجوز مسبقًا.
 
عند إنشاء نسخ جديدة من Buffer، تُقتَطَع بشكل افتراضي حجوزات الذاكرة التي تقل عن 4 كيلوبايت من نسخة Buffer واحدة محجوزة مسبقًا. هذا يساعد التطبيقات على تجنب زيادة مجمَّع المهملات (garbage allocation) عبر تقليل إنشاء نسخ Buffer جديدة وحجز أجزاء من الذاكرة بشكل فردي. يحسِّن ذلك الأداء واستخدام الذاكرة عبر تقليل الحاجة إلى تتبُّع وإزالة أقل قدر ممكن من الكائنات الموجودة والمتكرِّرة.
 
مع ذلك، في حال احتاج المطور إلى الاحتفاظ يجزءٍ صغيرٍ من الذاكرة يقع في المجمِّع (pool) المحجوز مسبقًا لفترة زمنية غير معلومة، فيُستحسَن إنشاء نسخة Buffer بحجز جزء آخر من الذاكر يقع خارج مجمِّع الذاكرة المحجوز مسبقًا (un-pooled) عبر استعمال SlowBuffer ثمَّ نسخ البيانات التي تريد الاحتفاظ بها إليها.
 
// الحاجة إلى الاحتفاظ ببعض أجزاء الذاكرة
 
const store = [];
 
socket.on('readable', () => {
 
 const sb = SlowBuffer(10);
 
 // حجز جزء من الذاكرة خاص بالبيانات المراد الاحتفاظ بها
 
 const sb = Buffer.allocUnsafeSlow(10);
 
 // نسخ البيانات إلى موقع جديد
 
 data.copy(sb, 0, 0, 10);
 
 store.push(sb);
 
});
 
يجب عدم اللجوء إلى استعمال الصنف SlowBuffer إلا في نهاية المطاف بعد أن يلاحظ المطور نفسه أنه احتفظ بأجزاء من الذاكرة لا حاجة له فيها في تطبيقه.
 
=== الدالة new SlowBuffer(size)‎ ===
أهملت في الإصدار v6.0.0.
 
الاستقرار: 0-مهمل: استعمل التابع Buffer.allocUnsafeSlow()‎ عوضًا عن هذه الدالة.
* size: ‏<integer> حجم الذاكرة المراد حجزه للنسخة Buffer المنشأة.
تنشئ هذه الدالة نسخة Buffer جديدة وتحجز لها من الذاكرة الحجم size المعطى. إن كانت قيمة المعامل size المعطاة أكبر من buffer.constants.MAX_LENGTH أو أصغر من الصفر، فسيُرمى الخطأ ERR_INVALID_OPT_VALUE. الجدير بالذكر أنَّه تنشأ النسخة Buffer إن أعطيت القيمة 0 للمعامل size.
 
انتبه إلى أنَّ هذه الدالة لا تهيئ الذاكرة التي تحجزها عند استعمالها لإنشاء نسخٍ من Buffer. نتيجةً لذلك، لا يُعرَف المحتوى الأولي للنسخة Buffer المنشأة آنذاك وقد يحوي بعض البيانات الحسَّاسة التي كتبت على تلك الذاكرة مسبقًا. إن أردت تهيئة جزء الذاكرة المحجوز ووضع قيمة أولية معروفة فيه، فاستعمل التابع buf.fill()‎.
 
const { SlowBuffer } = require('buffer');
 
const buf = new SlowBuffer(5);
 
console.log(buf);
 
// <Buffer 78 e0 82 02 01> :سيُطبع شيء شبيه بهذا
 
buf.fill(0);
 
console.log(buf);
 
// <Buffer 00 00 00 00 00> :سيُطبع
 
== ثوابت Buffer ==
أضيفت في الإصدار v8.2.0.
أضيفت في الإصدار v8.2.0.


انتبه إلى أنَّ buffer.constants خاصِّيَّةٌ في الوحدة buffer تُعاد عبر require('buffer')‎ وليست في Buffer العام أو نسخة Buffer.
انتبه إلى أنَّ <code>buffer.constants</code> خاصِّيَّةٌ في الوحدة <code>buffer</code> تُعاد عبر <code>require('buffer')</code>‎ وليست في <code>Buffer</code> العام أو نسخة <code>Buffer</code>.
 
===الخاصية <code>buffer.constants.MAX_LENGTH</code>===
=== الخاصية buffer.constants.MAX_LENGTH ===
أضيفت في الإصدار v8.2.0.
أضيفت في الإصدار v8.2.0.


تعيد هذه الخاصِّيَّة عددًا يمثل أكبر حجم مسموح لنسخة Buffer واحدة. فتكون قيمة هذا الثابت في الأنظمة ذات المعمارية 32 بت هي ‎(2^30)-1 (تقريبًا 1 غيغابايت)، وفي الأنظمة ذات المعمارية 64 بت هي ‎(2^31)-1 (تقريبًا 2 غيغابايت).
تعيد هذه الخاصِّيَّة عددًا يمثل أكبر حجم مسموح لنسخة <code>Buffer</code> واحدة. فتكون قيمة هذا الثابت في الأنظمة ذات المعمارية 32 بت هي ‎(2^30)-1 (تقريبًا 1 غيغابايت)، وفي الأنظمة ذات المعمارية 64 بت هي ‎(2^31)-1 (تقريبًا 2 غيغابايت).


هنالك اسم بديل لهذه الخاصِّيَّة هو buffer.kMaxLength.
هنالك اسم بديل لهذه الخاصِّيَّة هو <code>buffer.kMaxLength</code>.
 
===الخاصية <code>buffer.constants.MAX_STRING_LENGTH</code>===
=== الخاصية buffer.constants.MAX_STRING_LENGTH ===
أضيفت في الإصدار v8.2.0.
أضيفت في الإصدار v8.2.0.


تعيد هذه الخاصِّيَّة عددًا يمثل أكبر حجم مسموح لنسخة string واحدة، إذ يُحسَب هذا الحجم في واحدات الترميز UTF-16.
تعيد هذه الخاصِّيَّة عددًا يمثل أكبر حجم مسموح لنسخة <code>string</code> واحدة، إذ يُحسَب هذا الحجم في واحدات الترميز UTF-16.
 
قد تعتمد هذه القيمة على محرك JavaScript المُستعمَل.


== مصادر ==
قد تعتمد هذه القيمة على محرك [[JavaScript]] المُستعمَل.
* صفحة Buffer في توثيق Node.js الرسمي.
==مصادر==
*[https://nodejs.org/dist/latest-v10.x/docs/api/buffer.html صفحة Buffer في توثيق Node.js الرسمي.]
[[تصنيف:Node.js|{{SUBPAGENAME}}]]

المراجعة الحالية بتاريخ 11:16، 23 أكتوبر 2018

الاستقرار: 2-مستقر

قبل تعريف نوع الكائن TypedArray، لم يكن لدى JavaScript أيَّة آلية لقراءة وتعديل مجاري البيانات الثنائية (binary data streams). أُنشِئ الصنف Buffer ليكون جزءًا من واجهة Node.js البرمجيَّة من أجل التعامل مع المجاري الثمانيَّة (octet streams) في مجاري TCP، وعمليات أنظمة الملفات، وسياقاتٍ الأخرى.

لمَّا أوجد الكائن TypedArray، أصبح الصنف Buffer يُنفِّذ الواجهة البرمجية Uint8Array بطريقة أكثر كفاءةً وملائمةً مع Node.js.

النسخ المنشأة من الصنف Buffer مشابهة لمصفوفات الأعداد الصحيحة ولكن متوافقة مع حجم الذاكرة الخام الثابتة والمحجوزة خارج الكومة V8 (heap)‎. يُحدَّد حجم النسخة Buffer عند إنشائها ولا يمكن تغييرها بعد ذلك.

يقع الصنف Buffer ضمن النطاق العام (global scope)، لذا ليس هنالك حاجةٌ لاستعمال require('buffer').Buffer.

// وإسناد جزء من الذاكرة المؤقتة إليه بطول 10 وملئه بالأصفار Buffer إنشاء الكائن
const buf1 = Buffer.alloc(10);

// فيه ‎0x1 وإسناد جزء من الذاكرة المؤقتة إليه بطول 10 ووضع القيمة Buffer‎ إنشاء الكائن
const buf2 = Buffer.alloc(10, 1);

// .وإسناد جزء من الذاكرة المؤقتة إليه بطول 10 دون تهيئته Buffer إنشاء الكائن 
// ولكن قد تحتوي Buffer.alloc() إنَّ هذا أسرع بكثير من استدعاء
//  المعادة حينها على بيانات قديمة تركت في Buffer النسخة
// write() أو fill() هذا الجزء المحجوز. يمكن استبدالها إما باستدعاء 
const buf3 = Buffer.allocUnsafe(10);

// فيه ‎[0x1, 0x2, 0x3] وحجز جزء من الذاكرة ووضع القيمة Buffer إنشاء الكائن
const buf4 = Buffer.from([1, 2, 3]);

// ‎[0x74, 0xc3, 0xa9, 0x73, 0x74] وحجز جزء من الذاكرة ووضع البايتات Buffer إنشاء الكائن
// UTF-8 فيه وفقًا للترميز
const buf5 = Buffer.from('tést');

// ‎[0x74, 0xe9, 0x73, 0x74] وحجز جزء من الذاكرة ووضع البايتات Buffer إنشاء الكائن
// Latin-1 فيه وفقًا لترميز المحارف اللاتينية
const buf6 = Buffer.from('tést', 'latin1');

التابع Buffer.from()‎، والتابع Buffer.alloc()‎، والتابع Buffer.allocUnsafe()‎

في إصدارات Node.js ما قبل 6.0.0، تُنشَئ النسخ Buffer باستعمال دالة بانية تحجز جزءًا من الذاكرة للنسخة Buffer المعادة بطريقة تعتمد على الوسائط المُمرَّرة إليها وهي:

  • تمرير عدد كوسيط أول إلى الدالة Buffer()‎ (مثل new Buffer(10)‎) يحجز جزءًا من الذاكرة المؤقتة بالحجم المعطى ويُسنَد إلى كائن Buffer جديد. قبل الإصدار Node.js 8.0.0، لا يهيئ جزء الذاكرة المحجوز لبعض نسخ Buffer ويمكن بذلك أن يحتوي على بيانات قديمة حسَّاسة. في هذه الحالة، يجب تهيئة جزء الذاكرة المحجوز إمَّا عبر استعمال buf.fill(0)‎ لملء كامل الجزء المحجوز بأصفارٍ، أو عبر كتابة بيانات معيَّنة على كامل هذا الجزء. لمَّا كان عدم تهيئة الجزء المحجوز سلوكًا متعمدًا يحسِّن الأداء، فقد أظهرت تجربة التطوير (development experience) أنَّه ينبغي التفريق بشكل واضح بين إنشاء كائن Buffer دون تهيئته ولكن بسرعة مقابل إنشاء كائن Buffer آمن ولكن ببطء. بدءًا من الإصدار Node.js 8.0.0، يعيد استعمال الدالة بالشكل Buffer(num)‎ و new Buffer(num)‎ كائن Buffer مع تهيئة جزء الذاكرة المحجوز.
  • تمرير سلسلة نصية، أو مصفوفة، أو كائن Buffer كوسيط أول إلى الدالة Buffer()‎ يؤدي إلى إنشاء كائن Buffer ونسخ بيانات ذلك الكائن المُمرَّر إليه.
  • تمرير الكائن ArrayBuffer أو الكائن SharedArrayBuffer إلى الدالة Buffer()‎ يعيد كائن Buffer يتشارك جزءًا من الذاكرة المؤقتة المحجوزة مع ذلك الكائن المعطى.

لمَّا كان سلوك الدالة بالشكل new Buffer()‎ يختلف تبعًا لنوع الوسيط الأول المُمرَّر إليها، فمن الممكن أن تتعرض التطبيقات عن غير قصد لمشكلات متعلقة بالأمن والوثوقيَّة عندما لا يُتحقَّق من صحة الوسيط الأول أو لا يهيأ جزء الذاكرة المحجوز.

لجعل عمليَّة إنشاء نسخٍ من الصنف Buffer أكثر وثوقيَّة وأقل عرضةً للخطأ، أُهملت عدَّة أشكال من الدالة new Buffer()‎ البانية وحلَّ مكانها توابع مستقلة مثل Buffer.from()‎، و Buffer.alloc()‎، و Buffer.allocUnsafe()‎.

يجب على المطورين أن يتركوا استعمال الدالة new Buffer()‎ البانية كليًّا يجميع أشكالها، وأن ينتقلوا إلى ما يقابلها من الواجهات البرمجيَّة الجديدة التالية:

  • التابع Buffer.from(array)‎: يعيد هذا التابع كائن Buffer جديد يحوي نسخةً من القيمة الثمانية المُمرَّرة إليه.
  • التابع Buffer.from(arrayBuffer[, byteOffset[, length]])‎: يعيد كائن Buffer جديد يشارك الكائن ArrayBuffer المعطى جزءًا من الذاكرة المحجوز الخاص به.
  • التابع Buffer.alloc(size[, fill[, encoding]])‎: يعيد كائن Buffer مع حجز جزء ذي حجم مُحدَّد من الذاكرة المؤقتة وتهيئته. الجدير بالذكر أنَّ هذا التابع أبطأ من التابع Buffer.allocUnsafe(size)‎ ولكنه يضمن أنَّ نُسَخ Buffer المنشأة حديثًا آنذاك لا تحوي أيَّة بيانات قديمة يحتمل أن تكون معلومات حسَّاسة ومهمَّة.
  • التابع Buffer.allocUnsafe(size)‎ والتابع Buffer.allocUnsafeSlow(size)‎: يعيد كلًّا منهما كائن Buffer جديد دون تهيئة الحجم size المحجوز من الذاكرة المؤقتة آنذاك. بناءً على ذلك، قد يحتوي هذا الجزء المحجوز على بيانات قديمة يحتمل أن تكون حسَّاسة.

النسخ Buffer التي يعيدها التابع Buffer.allocUnsafe()‎ قد تكون محجوزة خارج مُجمَّع الذاكرة الداخلي المشترك (shared internal memory pool) إن كانت قيمة الوسيط size أقل أو مساويةً لنصف القيمة Buffer.poolSize. أمَّا النُسخ التي يعيدها التابع Buffer.allocUsafeSlow()‎، فلا تستعمل مجمَّع الذاكرة الداخلية المشتركة مطلقًا.

الخيار ‎--zero-fill-buffers في سطر الأوامر

أضيف في الإصدار v5.10.0.

يمكن أن تبدأ Node.js باستعمال الخيار ‎--zero-fill-buffers في سطر الأوامر لإضافة أصفارٍ إلى الجزء الذي تحجزه نسخ Buffer الجديدة من الذاكرة المؤقتة عند إنشائها باستعمال new Buffer(size)‎، و Buffer.allocUnsafe()‎، و Buffer.allocUnsafeSlow()‎، و new SlowBuffer(size)‎ ...إلخ. يؤثِّر استعمال هذه الراية سلبًا على الأداء بدرجة كبيرة ولا ينصح باستعماله إلا في الحالات الضرورية التي لا يراد فيها أن تحتوي نسخ Buffer الجديدة على أيَّة بيانات قديمة قد يحتمل أن تكون حسَّاسة.

$ node --zero-fill-buffers
> Buffer.allocUnsafe(5);
<Buffer 00 00 00 00 00>

ما الذي يجعل استعمال التابع Buffer.allocUnsafe()‎ والتابع Buffer.allocUnsafeSlow()‎ غير آمن؟

عند استدعاء التابع Buffer.allocUnsafe()‎ والتابع Buffer.allocUnsafeSlow()‎، لا يُهيَّأ جزء الذاكرة المحجوز (لا تُمسَح البيانات القديمة الموجودة فيه سابقًا).لمَّا كان تصميم هذين التابعين يعتمد على السرعة في حجز جزءٍ من الذاكرة، فقد يحتوي هذا الجزء المحجوز على بيانات قديمة كُتبت فيه مسبقًا ربما تكون حسَّاسة. استعمال نسخة Buffer أنشأت باستخدام التابع Buffer.allocUnsafe()‎ ودون إعادة كتابة بيانات جديدة في كامل جزء الذاكرة يؤدي إلى تسريب وكشف تلك البيانات القديمة عند قراءة النسخة Buffer.

صحيحٌ أنَّ استعمال التابع Buffer.allocUnsafe()‎ والتابع Buffer.allocUnsafeSlow()‎ له ميزة كبيرة في تحسين الأداء إلا أنَّه يجب أخذ المزيد من الحيطة والحذر لتجنب وجود ثغرات تؤثِّر على الحماية.

ترميز المحارف

سجل التغييرات
الإصدار التغييرات
v6.4.0 أصبح الترميز latin1 اسمًا بديلًا للترميز binary.
v5.0.0 إزالة الترميز raw والترميز raws اللذان كانا مهملين.

يمكن تحديد ترميز المحارف المراد استعماله عند تخزين أو جلب سلسلة نصية من البيانات من النسخة Buffer.

const buf = Buffer.from('hello world', 'ascii');

console.log(buf.toString('hex'));
// 68656c6c6f20776f726c64 :سيُطبع
console.log(buf.toString('base64'));
// aGVsbG8gd29ybGQ= :سيُطبع

console.log(Buffer.from('fhqwhgads', 'ascii'));
// <Buffer 66 68 71 77 68 67 61 64 73> :سيُطبع
console.log(Buffer.from('fhqwhgads', 'utf16le'));
// <Buffer 66 00 68 00 71 00 77 00 68 00 67 00 61 00 64 00 73 00> :سيُطبع

ترميزات المحارف التي تدعمها Node.js حاليًا هي:

  • 'ascii': ترمَّز المحارف باستعمال الترميز ASCII الذي يكون فيه حجم المحرف 7 بت فقط. يَقتطِع هذا الترميز البت الثامن الأكثر أهميَّة (MSB) من كامل البايت، ويوصف بسرعته الكبيرة.
  • 'utf8': ترمَّز المحارف باستعمال الترميز الموحَّد (Unicode) للمحارف متعدِّدة البايتات، وتستعمله أغلب صفحات الويب والمستندات.
  • 'utf16le': ترمَّز المحارف باستعمال الترميز الموحد بحجم 2 أو 4 بايت مع ضبط ترتيب تخزين البايتات الأكثر أهميَّة أولًا (little-endian). الأزواج البديلة (من U+10000 إلى U+10FFFF) مدعومةٌ أيضًا.
  • 'ucs2': هو اسمٌ بديلٌ للترميز 'utf16le'.
  • 'base64': ترمَّز المحارف باستعمال الترميز Base64. عند إنشاء نسخة Buffer من سلسلة نصية، فسيَقبل هذا الترميز بشكل صحيح «الأبجدية الآمنة لعناوين URL وأسماء الملفات» كما هو مذكورٌ في المعيار RFC4648 في القسم الخامس.
  • 'latin1': ترمَّز البيانات إلى سلسلة نصية مرمَّزة ببايت واحد (one-byte encoded string) كما حدَّدته IANA في المعيار RFC1346 في الصفحة 63 ليكون كتلةً ملحقة بالترميز Latin-1 وشيفرات التحكم C0/C1.
  • 'binary': اسمٌ بديلٌ للترميز 'latin1'.
  • 'hex': يرمَّز كلُّ بايت بمحرفين ست عشريين.

تتبع متصفحات الويب الحديثة معيار الترميز WHATWG الذي أصبح فيه الترميز 'latin1' والترميز 'ISO-8859-1' اسمين بديلين للترميز 'win-1252'. هذا يعني أنَّه إن أعيدت بيانات أثناء إجراء بعض العمليات، مثل http.get()‎، وكانت مرمَّزة بإحدى الترميزات المدرجة في معيار WHATWG، فمن المحتمل أنَّ الخادم قد أعاد تلك البيانات بترميز 'win-1252'؛ في هذه الحالة، يؤدي استعمال الترميز 'latin1' إلى فك ترميزها عن طريق الخطأ.

الصنف Buffer والكائن TypedArray

سجل التغييرات
الإصدار التغييرات
v3.0.0 أصبح الصنف Buffer يرث من الكائن Uint8Array.

النسخ Buffer هي أيضًا نسخ Uint8Array. مع ذلك، هنالك مشكلات غامضة متعلقة بالتوافقيَّة مع الكائن TypedArray. على سبيل المثال، ينشئ التابع ArrayBuffer.slice()‎ كائن ArrayBuffer جديد يحوي نسخةً من الجزء المحدَّد من البيانات، بينما يعيد تنفيذ التابع نفسه بالشكل Buffer.slice()‎ مرجعًا يشير إلى الجزء المحدَّد من البيانات للنسخة Buffer الموجودة ولا ينسخها. بناءً على ذلك، يكون استعمال Buffer.slice()‎ أكثر كفاءةً.

من الممكن أيضًا إنشاء نُسَخ TypedArray جديدة من الكائن Buffer مع الانتباه إلى الأمرين التاليين:

  1. تُنسَخ محتويات ذاكرة الكائن Buffer إلى الكائن TypedArray ولا تُشارَك معه.
  2. تُفسَّر ذاكرة الكائن Buffer على أنَّها مصفوفة من عناصر مختلفة وليست مصفوفة من البايتات من النوع المستهدف. نتيجةً لذلك، نجد أنَّ new Uint32Array(Buffer.from([1, 2, 3, 4]))‎ ينشئ أربعة عناصر من النسخة Uint32Array هي [1, 2, 3, 4] وليس نسخة من العنصر الوحيد [0x1020304] أو [0x4030201].

يمكن أيضًا إنشاء نسخة Buffer جديدة تتشارك جزء الذاكرة الحجوز نفسه كنسخة TypedArray عبر استعمال الخاصِّيَّة ‎.buffer للكائن TypeArray.

const arr = new Uint16Array(2);

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

// `arr` نسخ محتوى
const buf1 = Buffer.from(arr);
// `arr` مشاركة الذاكرة مع
const buf2 = Buffer.from(arr.buffer);

console.log(buf1);
// <Buffer 88 a0> :سيُطبع
console.log(buf2);
// <Buffer 88 13 a0 0f> :سيُطبع

arr[1] = 6000;

console.log(buf1);
// <Buffer 88 a0> :سيطبع
console.log(buf2);
// <Buffer 88 13 70 17> :سيطبع

انتبه أيضًا إلى أنَّه عند إنشاء Buffer جديد باستعمال الخاصِّيَّة ‎.buffer للكائن TypedArray، فمن الممكن استعمال جزءٍ من الكائن ArrayBuffer الضمني عبر تمرير مقدار الإزاحة byteOffset بالبايت وطول الجزء length من الذاكرة المراد مشاركته فقط بالشكل التالي:

const arr = new Uint16Array(20);
const buf = Buffer.from(arr.buffer, 0, 16);

console.log(buf.length);
// 16 :سيُطبع

يختلف التابعان buffer.from()‎ و TypedArray.from()‎ في الشكل وطريقة التنفيذ، إذ تقبل المتغيرات TypedArray أن يُمرَّر لها دالة كوسيط ثانٍ لاستدعائها مع كل عنصر من عناصرها:

  • TypedArray.from(source[, mapFn[, thisArg]])‎

بينما لا يدعم التابع Buffer.from()‎ استعمال مثل تلك الدالة:

  • Buffer.from(array)‎
  • Buffer.from(buffer)‎
  • Buffer.from(arrayBuffer[, byteOffset[, length]])‎
  • Buffer.from(string[, encoding])‎

الصنف Buffer والتكرار (iteration)

يمكن وضع النسخ Buffer في حلقة تكراريَّة عبر استعمال الصيغة for..of:

const buf = Buffer.from([1, 2, 3]);

// :سيُطبع
//   1
//   2
//   3
for (const b of buf) {
  console.log(b);
}

أضف إلى ذلك أنَّ التوابع buf.values()‎، و buf.keys()‎، و buf.entries()‎ يمكن استعمالها لإنشاء مكرارات (iterators).

الصنف Buffer

الصنف Buffer هو نوعٌ عامٌّ يُستعمَل للتعامل مع البيانات الثنائيَّة بشكل مباشر، ويمكن إنشاؤه بطرائق عدَّة سنذكرها جميعها.

Buffer(array)‎

سجل التغييرات
الإصدار التغييرات
v10.0.0 أصبح استدعاء هذه الدالة البانية ضمن شيفرة تقع خارج المجلد node_modules يُصدِر تحذيرًا بأنَّ هذه الدالة مهملة.
v7.2.1 استدعاء هذه الدالة البانية لم يعد يصدر تحذيرًا بأنَّ هذه الدالة مهملة.
v7.0.0 أصبح استدعاء هذه الدالة البانية يصدر تحذيرًا بأنَّ هذه الدالة مهملة.
v6.0.0 أهملت هذه الدالة.

الاستقرار: 0-مهمل: استعمل التابع Buffer.from(array)‎ عوضًا عن هذه الدالة.

  • array: ‏integer[]>‎> مصفوفةٌ من البايتات المراد نسخها.

تنشئ هذه الدالة نسخة Buffer جديدة وتحجز جزءًا من ذاكرة التخزين المؤقت تضع فيه نسخةً من محتويات المعامل array المعطى.

// UTF-8 بترميز 'buffer' جديدة تحتوي على بايتات السلسلة النصية Buffer إنشاء نسخة
const buf = new Buffer([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);

Buffer(arrayBuffer[, byteOffset[, length]])‎

سجل التغييرات
الإصدار التغييرات
v10.0.0 أصبح استدعاء هذه الدالة البانية ضمن شيفرة تقع خارج المجلد node_modules يُصدِر تحذيرًا بأنَّ هذه الدالة مهملة.
v7.2.1 استدعاء هذه الدالة البانية لم يعد يصدر تحذيرًا بأنَّ هذه الدالة مهملة.
v7.0.0 أصبح استدعاء هذه الدالة البانية يصدر تحذيرًا بأنَّ هذه الدالة مهملة.
v6.0.0 إضافة المعاملان byteOffset و length.
v6.0.0 أهملت هذه الدالة.
v3.0.0 أضيفت هذه الدالة.

الاستقرار: 0-مهمل: استعمل التابع Buffer.from(arrayBuffer[, byteOffset[, length]])‎ عوضًا عن هذه الدالة.

  • arrayBuffer: ‏<ArrayBuffer> | <SharedArrayBuffer> كائنٌ من النوع ArrayBuffer أو من النوع SharedArrayBuffer أو الخاصِّيَّة ‎.buffer للكائن TypedBuffer.
  • byteOffset: ‏<integer> فهرس البايت الأول الذي سيبدأ عنده مشاركة جزءٍ من الذاكرة. القيمة الافتراضية هي: 0.
  • length: ‏<integer> عدد بايتات الذاكرة المراد مشاركتها. القيمة الافتراضيَّة هي: arrayBuffer.length - byteOffset.

تنشئ هذه الدالة نسخة Buffer جديدة وتتشارك جزء الذاكرة الخاص بالكائن ArrayBuffer أو SharedArrayBuffer دون نسخ ما يحتويه. عندما نُمرِّر مثلًا مرجعًا للخاصِّيَّة ‎.buffer في النسخة TypedArray، فستتشارك النسخة Buffer الجديدة المنشأة آنذاك مع نفس الذاكرة المحجوزة من طرف TypedArray.

إن مُرِّر المعاملان byteOffset و length الاختياريان، فسيُحدِّدان مجالًا من الذاكرة ضمن arrayBuffer تريد النسخة Buffer مشاركته فقط.

const arr = new Uint16Array(2);

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

// `arr` مشاركة الذاكرة مع
const buf = new Buffer(arr.buffer);

console.log(buf);
// <Buffer 88 13 a0 0f> :سيطبع
 
// أيضًا Buffer الأصلي يؤدي إلى تغيير Uint16Array تغيير
arr[1] = 6000;

console.log(buf);
// <Buffer 88 13 70 17> :سيطبع

Buffer(buffer)‎

سجل التغييرات
الإصدار التغييرات
v10.0.0 أصبح استدعاء هذه الدالة البانية ضمن شيفرة تقع خارج المجلد node_modules يُصدِر تحذيرًا بأنَّ هذه الدالة مهملة.
v7.2.1 استدعاء هذه الدالة البانية لم يعد يصدر تحذيرًا بأنَّ هذه الدالة مهملة.
v7.0.0 أصبح استدعاء هذه الدالة البانية يصدر تحذيرًا بأنَّ هذه الدالة مهملة.
v6.0.0 أهملت هذه الدالة.

الاستقرار: 0-مهمل: استعمل Buffer.from(buffer)‎ عوضًا عن هذه الدالة.

  • buffer: ‏<Buffer> | <Uint8Array> نسخةٌ من Buffer أو Unit8Array يراد نسخ البيانات منها.

تنشئ هذه الدالة نسخة Buffer جديدة وتضع فيها نسخةً من محتوى المعامل buffer المعطى.

const buf1 = new Buffer('buffer');
const buf2 = new Buffer(buf1);

buf1[0] = 0x61;

console.log(buf1.toString());
// auffer :سيطبع
console.log(buf2.toString());
// buffer :سيطبع

Buffer(size)‎

سجل التغييرات
الإصدار التغييرات
v10.0.0 أصبح استدعاء هذه الدالة البانية ضمن شيفرة تقع خارج المجلد node_modules يُصدِر تحذيرًا بأنَّ هذه الدالة مهملة.
v8.0.0 ستهيئ new Buffer(size)‎ جزء الذاكرة الذي تحجزه دومًا وتضع فيه أصفارًا.
v7.2.1 استدعاء هذه الدالة البانية لم يعد يصدر تحذيرًا بأنَّ هذه الدالة مهملة.
v7.0.0 أصبح استدعاء هذه الدالة البانية يُصدِر تحذيرًا بأنََّّ هذه الدالة مهملة.
v6.0.0 أُهملَت هذه الدالة.

الاستقرار: 0-مهمل: استعمل التابع Buffer.alloc()‎ عوضًا عن هذه الدالة (انظر أيضًا التابع Buffer.allocUnsafe()‎).

  • size: ‏<integer> حجم الذاكرة المراد حجزه للنسخة Buffer المنشأة.

تنشئ هذه الدالة نسخة Buffer جديدة وتحجز لها جزءًا من الذاكرة بالحجم size المعطى. إن كانت قيمة المعامل size المعطاة أكبر من buffer.constants.MAX_LENGTH أو أصغر من الصفر، فسيرمى الخطأ ERR_INVALID_OPT_VALUE. الجدير بالذكر أنَّه تُنشَأ النسخة Buffer إن أعطيت القيمة 0 للمعامل size.

قبل الإصدار Node.js 8.0.0، لم تكن تهيأ الذاكرة التي يتم حجزها للنسخ Buffer، لذا يكون محتوى النسخة Buffer المنشأة حديثًا آنذاك غير معروف وقد يحوي بيانات حساسة كتبت على تلك الذاكرة مسبقًا. استعمل حينئذ التابع Buffer.alloc(size)‎ الذي يهيئ الذاكرة عبر وضع أصفارٍ فيها.

const buf = new Buffer(10);

console.log(buf);
// <Buffer 00 00 00 00 00 00 00 00 00 00> :سيُطبَع

Buffer(string[, encoding])‎

سجل التغييرات
الإصدار التغييرات
v10.0.0 أصبح استدعاء هذه الدالة البانية ضمن شيفرة تقع خارج المجلد node_modules يُصدِر تحذيرًا بأنَّ هذه الدالة مهملة.
v7.2.1 استدعاء هذه الدالة البانية لم يعد يصدر تحذيرًا بأنَّ هذه الدالة مهملة.
v7.0.0 أصبح استدعاء هذه الدالة البانية يُصدِر تحذيرًا بأنََّّ هذه الدالة مهملة.
v6.0.0 أُهملَت هذه الدالة.

الاستقرار: 0-مهمل: استعمل التابع Buffer.from(string[, encoding])‎ عوضًا عن هذه الدالة.

  • string: ‏<string> السلسلة النصية المراد ترميزها ووضعها في النسخة Buffer المنشأة.
  • encoding: ‏<string> الترميز المراد استعماله مع السلسلة النصية string المعطاة. القيمة الافتراضيَّة هي: 'utf8'.

تنشئ هذه الدالة نسخة Buffer جديدة وتضع فيها السلسلة النصية string المعطاة بعد ترميزها باستعمال الترميز المحدَّد في المعامل encoding.

const buf1 = new Buffer('this is a tést');
const buf2 = new Buffer('7468697320697320612074c3a97374', 'hex');

console.log(buf1.toString());
// this is a tést :سيُطبَع
console.log(buf2.toString());
// this is a tést :سيُطبَع
console.log(buf1.toString('ascii'));
// this is a tC)st :سيُطبَع

Buffer.alloc(size[, fill[, encoding]])‎

سجل التغييرات
الإصدار التغييرات
v10.0.0 يرمى استثناء عند محاولة وضع أصفار في الموقع الذي لا يحوي قيمة صفرية من الذاكرة الخاصَّة بالنسخة buffer.
v10.0.0 يرمى استثناء عند إعطاء المعامل fill سلسلة نصية غير صالحة.
v8.9.3 يؤدي إعطاء المعامل fill سلسلة نصية غير صالحة إلى تجاهلها واستعمال القيمة الافتراضية لهذا المعامل.
v5.10.0 أضيف هذا التابع.
  • size: ‏<integer> حجم الذاكرة المراد حجزه للنسخة Buffer المنشأة.
  • fill: ‏‏<string> | ‏<Buffer>‏‏ | ‏<integer>‏ القيمة الأوليَّة للنسخة Buffer الجديدة التي ستُوضع في الذاكرة عند حجزها. القيمة الافتراضيَّة هي: 0.
  • encoding: ‏<string> إن كان المعامل fill سلسلة نصية، فستمثل قيمة هذا المعامل الترميز المستعمل معها. القيمة الافتراضيَّة هي: 'utf8'.

تنشئ هذه الدالة نسخة Buffer جديدة وتحجز لها جزءًا من الذاكرة بالحجم size المعطى. إن لم يعطَ المعامل fill أو أعطي وكانت قيمته undefined، فستملأ الذاكرة المحجوزة بأصفار كقيمة أوليَّة.

const buf = Buffer.alloc(5);

console.log(buf);
// <Buffer 00 00 00 00 00> :سيُطبع

إن كانت قيمة المعامل size المعطاة أكبر من buffer.constants.MAX_LENGTH أو أصغر من الصفر، فسيرمى الخطأ ERR_INVALID_OPT_VALUE. الجدير بالذكر أنَّه تنشأ النسخة Buffer إن أعطيت القيمة 0 للمعامل size. إن أعطي المعامل fill، فسيهيأ جزء الذاكرة المحجوز عبر استدعاء buf.fill(fill)‎.

const buf = Buffer.alloc(5, 'a');

console.log(buf);
// <Buffer 61 61 61 61 61> :سيُطبع

إن أعطي المعاملان fill و encoding كلاهما، فسيُهيَّأ جزء الذاكرة المحجوز عبر استدعاء buf.fill(fill, encoding)‎.

const buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64');

console.log(buf);
// <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64> :سيُطبع

يجدر بالذكر أنَّ استدعاء Buffer.alloc()‎ أبطأ بكثير من استدعاء التابع Buffer.allocUnsafe()‎ المشابه والسبب أنَّ الأول يكتب على الذاكرة التي يحجزها قيمةً محدَّدةً للتأكد من عدم الوصول إلى بيانات موجودة في هذه الذاكرة مسبقًا يحتمل أن تكون حسَّاسة.

سيرمى الخطأ TypeError إن لم يكن المعامل size عددًا.

 Buffer.allocUnsafe(size)

سجل التغييرات
الإصدار التغييرات
v7.0.0 يرمى خطأ الآن عند استعمال قيمة سالبة مع المعامل size.
v5.10.0 أضيف هذا التابع.
  • size: ‏<integer> حجم الذاكرة المراد حجزه للنسخة Buffer المنشأة.

تنشئ هذه الدالة نسخة Buffer جديدة وتحجز لها جزءًا من الذاكرة بالحجم size المعطى. إن كانت قيمة المعامل size المعطاة أكبر من buffer.constants.MAX_LENGTH أو أصغر من الصفر، فسيرمى الخطأ ERR_INVALID_OPT_VALUE. الجدير بالذكر أنَّه تنشأ النسخة Buffer إن أعطيت القيمة 0 للمعامل size.

انتبه إلى أنَّ هذا التابع لا يهيئ الذاكرة التي يحجزها عند استعماله لإنشاء نسخٍ من Buffer. نتيجةً لذلك، لا يُعرَف المحتوى الأولي للنسخة Buffer المنشأة آنذاك وقد يكون بيانات حساسة كتبت على تلك الذاكرة مسبقًا. إن أردت تهيئة جزء الذاكرة المحجوز ووضع قيمة أولية معروفة فيه، فاستعمل التابع Buffer.alloc()‎.

const buf = Buffer.allocUnsafe(10);

console.log(buf);
// (contents may vary): <Buffer a0 8b 28 3f 01 00 00 00 50 32> :سيُطبع

buf.fill(0);

console.log(buf);
// <Buffer 00 00 00 00 00 00 00 00 00 00> :سيُطبع

سيرمى الخطأ TypeError إن لم يكن المعامل size عددًا.

انتبه إلى أنَّ الوحدة Buffer تحجز مسبقًا نسخة Buffer داخلية بحجم Buffer.poolSize تستعملها ككتلة مشتركة لتسريع عملية حجز نُسَخ Buffer جديدة باستعمال التابع Buffer.allocUnsafe()‎ والدالة new Buffer(size)‎ المهملة أيضًا شرط أن تكون قيمة size أصغر أو تساوي القيمة Buffer.poolSize >> 1 (ناتج قسمة Buffer.poolSize على 2 بعد تقريبه إلى أقرب عدد صحيح).

استعمال هذا الحجز الداخلي المسبق لكتلة (pool) من الذاكرة هو جوهر الاختلاف بين الاستدعاء Buffer.alloc(size, fill)‎ والاستدعاء Buffer.allocUnsafe(size).fill(fill)‎. بناءً على ذلك، نجد أنَّ Buffer.alloc(size, fill)‎ لا يستخدم هذه الكتلة من الذاكرة المحجوزة مسبقًا بينما يستعملها التابع Buffer.allocUnsafe(size).fill(fill)‎ إن كانت قيمة size أصغر أو تساوي نصف القيمة Buffer.poolSize. قد يكون الفرق غامضًا بعض الشيء إلا أنَّه يلعب دورًا مهمًا في تسريع الأداء الذي يستطيع Buffer.allocUnsafe()‎ أن يوفِّره خصوصًا عندما يتطلب التطبيق ذلك.

Buffer.allocUnsafeSlow(size)‎

أضيف في الإصدار v5.12.0.

  • size: ‏<integer> حجم الذاكرة المراد حجزه للنسخة Buffer المنشأة.

تنشئ هذه الدالة نسخة Buffer جديدة وتحجز لها من الذاكرة الحجم size المعطى. إن كانت قيمة المعامل size المعطاة أكبر من buffer.constants.MAX_LENGTH أو أصغر من الصفر، فسيرمى الخطأ ERR_INVALID_OPT_VALUE. الجدير بالذكر أنَّه تنشأ النسخة Buffer إن أعطيت القيمة 0 للمعامل size.

انتبه إلى أنَّ هذا التابع لا يهيئ الذاكرة التي يحجزها عند استعماله لإنشاء نسخٍ من Buffer. نتيجةً لذلك، لا يُعرف المحتوى الأولي للنسخة Buffer المنشأة آنذاك وقد يكون بعض البيانات الحسَّاسة التي كتبت على تلك الذاكرة مسبقًا. إن أردت تهيئة جزء الذاكرة المحجوز ووضع قيمة أولية معروفة فيه، فاستعمل التابع buf.fill()‎.

عند استعمال Buffer.allocUnsafe()‎ لإنشاء نسخٍ جديدة من Buffer، فستُقتَطَع حجوزات الذاكرة التي تقل عن 4 كيلوبايت من نسخة Buffer واحدة محجوزة مسبقًا (التي شُرحت آنفًا). هذا يساعد التطبيقات على تجنب زيادة مجمَّع المهملات (garbage allocation) عبر تقليل إنشاء نسخ Buffer جديدة وحجز أجزاء من الذاكرة بشكل فردي. يحسِّن ذلك الأداء واستخدام الذاكرة عبر تقليل الحاجة إلى تتبُّع وإزالة أقل قدر ممكن من الكائنات الموجودة والمتكررة.

مع ذلك، في حال احتاج المطور إلى الاحتفاظ يجزءٍ صغيرٍ من الذاكرة يقع في المجمع (pool) المحجوز مسبقًا لفترة زمنية غير معلومة، فيُستحسن إنشاء نسخة Buffer بحجز جزء آخر من الذاكر يقع خارج مجمع الذاكرة المحجوز مسبقًا (un-pooled) عبر استعمال Buffer.allocUnsafeSlow()‎ ثمَّ نسخ البيانات التي تريد الاحتفاظ بها.

// الحاجة إلى الاحتفاظ ببعض أجزاء الذاكرة
const store = [];

socket.on('readable', () => {
  const data = socket.read();

  // حجز جزء من الذاكرة خاص بالبيانات المراد الاحتفاظ بها
  const sb = Buffer.allocUnsafeSlow(10);

  // نسخ البيانات إلى موقع جديد
  data.copy(sb, 0, 0, 10);

  store.push(sb);
});

يجب عدم اللجوء إلى استعمال التابع Buffer.allocUnsafeSlow()‎ إلا في نهاية المطاف بعد أن يلاحظ المطور نفسه أنه احتفظ بأجزاء من الذاكرة لا حاجة له فيها في تطبيقه.

سيرمى الخطأ TypeError إن لم يكن المعامل size عددًا.

Buffer.byteLength(string[, encoding])‎

سجل التغييرات
الإصدار التغييرات
v7.0.0 يرمى خطأ الآن عند تمرير قيم غير صحيحة.
v5.10.0 يمكن أن يكون المعامل string أحد الكائنات TypedArray أو DataView أو ArrayBuffer.
v0.1.90 أضيف هذا التابع.
  • string: ‏<string>‏‏ | <Buffer>‏ | ‏‏<TypedArray>‏ | ‏<DataView> | ‏<ArrayBuffer> | ‏<SharedArrayBuffer‏>‏ القيمة المراد حساب طولها (عدد بايتاتها).
  • encoding: ‏<string> إن كان المعامل string سلسلة نصية، فسيمثَّل هذا المعامل الترميز الذي سيُستعمَل معها. القيمة الافتراضيَّة هي: 'utf8'.
  • القيم المعادة: <integer> يعاد عدد بايتات المعامل string المعطى.

يعيد هذا التابع عدد البايتات الحقيقي للسلسلة النصية المُمرَّرة إليه. لا يشبه هذا التابع الخاصِّيَّة String.prototype.length التي تعيد عدد المحارف الموجودة في السلسلة النصية وليس عدد البايتات.

عند استعمال الترميز 'base64' والترميز 'hex'، يَفترض هذا التابع أنَّ جميع المدخلات صالحة. أمَّا عند إعطاء سلاسل نصية تحتوي على بيانات غير مرمَّزة بالترميز Base64 أو Hex (مثل المسافات البيضاء)، فقد تكون القيمة المعادة أكبر من طول النسخة Buffer المنشأة من تلك السلسلة حينذاك.

const str = '\u00bd + \u00bc = \u00be';

console.log(`${str}: ${str.length} characters, ` +
            `${Buffer.byteLength(str, 'utf8')} bytes`);
// ½ + ¼ = ¾: 9 characters, 12 bytes

عندما يكون المعامل string المعطى أحد الأنواع التالية: Buffer، أو DataView، أو TypedArray، أو ArrayBuffer، أو SharedArrayBuffe، فسيُعاد عدد البيانات الفعلي لهذا المعامل.

Buffer.compare(buf1, buf2)

سجل التغييرات
الإصدار التغييرات
v8.0.0 أصبح بالإمكان استعمال الكائن Uint8Array مع المعاملين المُمرَّرين إلى التابع.
v0.11.13 أضيف هذا التابع.
  • buf1: ‏<Buffer> | <Uint8Array> القيمة الأولى المراد موازتنها مع قيمة ثانية.
  • buf2: ‏<Buffer> | <Uint8Array> القيمة الثانية المراد موازتنها مع القيمة الأولى.

يوازن هذا التابع بين المعاملين buf1 و buf2 المُمرَّرين إليه ثمَّ يعيد عددًا صحيحًا، إذ يستعمل عادةً بغرض ترتيب المصفوفات في النسخ Buffer. عمل هذا التابع مشابهٌ تمامًا للاستدعاء buf1.compare(buf2).

const buf1 = Buffer.from('1234');
const buf2 = Buffer.from('0123');
const arr = [buf1, buf2];

console.log(arr.sort(Buffer.compare));
// Prints: [ <Buffer 30 31 32 33>, <Buffer 31 32 33 34> ]
// ([buf2, buf1] هذه النتيجة مساوية إلى)

Buffer.concat(list[, totalLength])‎

سجل التغييرات
الإصدار التغييرات
v8.0.0 أصبح بالإمكان استعمال الكائن Uint8Array مع المعامل list المُمرَّر إلى التابع.
v0.7.11 أضيف هذا التابع.
  • list: ‏<Buffer[]> | <Uint8Array> قائمةٌ من النسخ Buffer أو Uint8Array المراد دمجها مع بعضها بعضًا.
  • totalLength:‏ <integer> الطول الكلي للنسخ Buffer أو Uint8Array المراد دمجها.

يدمج هذا التابع جميع النسخ Buffer أو Uint8Array المُحدَّدة في المعامل list مع بعضها بعضها ووفقًا للطول totalLength المعطى ثمَّ ينشئ نسخة Buffer جديدة يضع الناتج فيها ويعيدها.

إن لم يحوي المعامل list أيَّ عنصر أو كانت قيمة المعامل totalLength المعطاة 0، فستعاد نسخة Buffer جديدة بطول 0.

إن لم يعطَ المعامل totalLength، فسيحسب من النسخ Buffer الموجودة في المعامل list. هذا الأمر سيُقلِّل من الأداء، إذ ستزيد العمليات المنفَّذة لحساب الطول الكلي totalLength المراد دمجه. بناءً على ذلك، يُفضَّل حساب قيمة totalLength ثمَّ تمريرها إلى التابع إن كان بالإمكان.

إن أعطيت قيمة المعامل totalLength، فسيُحوَّل إلى عدد صحيح عديم الإشارة (unsigned integer). إن زاد طول النُسَخ المعطاة في المعامل list المراد دمجها عن القيمة totalLength المعطاة، فستُقتَطَع نتيجة دمج جميع تلك النسخ لتصبح مساوية للطول totalLength.

// في نسخة واحدة Buffer دمج ثلاث نسخٍ من

const buf1 = Buffer.alloc(10);
const buf2 = Buffer.alloc(14);
const buf3 = Buffer.alloc(18);
const totalLength = buf1.length + buf2.length + buf3.length;

console.log(totalLength);
// 42 :سيُطبع

const bufA = Buffer.concat([buf1, buf2, buf3], totalLength);

console.log(bufA);
// <Buffer 00 00 00 00 ...> :سيُطبع
console.log(bufA.length);
// 42 :سيُطبع

Buffer.from(array)‎

أضيف في الإصدار v5.10.0.

  • array: ‏<integer[]‎> مصفوفةٌ من البايتات المراد نسخها.

تنشئ هذه الدالة نسخة Buffer جديدة وتحجز جزءًا من ذاكرة التخزين المؤقت تضع فيه نسخةً من محتويات المعامل array.

// UTF-8 بعد ترميزها باستعمال 'buffer' جديدة تحتوي على محارف السلسلة النصية Buffer إنشاء نسخة
const buf = Buffer.from([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);

سيرمى الخطأ TypeError إن لم يكن المعامل array مصفوفةً.

Buffer.from(arrayBuffer[, byteOffset[, length]])‎

أضيف في الإصدار v5.10.0.

  • arrayBuffer: ‏<ArrayBuffer> | <SharedArrayBuffer> كائنٌ من النوع ArrayBuffer أو من النوع SharedArrayBuffer أو الخاصِّيَّة ‎.buffer للكائن TypedBuffer.
  • byteOffset: ‏<integer> فهرس البايت الأول الذي سيبدأ عنده مشاركة جزءٍ من الذاكرة. القيمة الافتراضيَّة هي: 0.
  • length: ‏<integer> عدد بايتات الذاكرة المراد مشاركتها. القيمة الافتراضيَّة هي: arrayBuffer.length - byteOffset.

تنشئ هذه الدالة نسخة Buffer جديدة وتتشارك جزء الذاكرة الخاص بالكائن ArrayBuffer أو SharedArrayBuffer دون نسخ ما تحتويها. عندما نُمرِّر مثلًا مرجعًا للخاصِّيَّة ‎.buffer في النسخة TypedArray، ستتشارك النسخة Buffer الجديدة المنشأة آنذاك مع نفس الذاكرة المحجوزة من طرف TypedArray.

const arr = new Uint16Array(2);

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

// `arr` مشاركة الذاكرة مع
const buf = Buffer.from(arr.buffer);

console.log(buf);
// <Buffer 88 13 a0 0f> :سيُطبع

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

console.log(buf);
// <Buffer 88 13 70 17> :سيُطبع

إن مُرِّر المعاملان byteOffset و length الاختياريان، فسيُحدِّدان مجالًا من الذاكرة ضمن arrayBuffer تريد النسخة Buffer مشاركته فقط.

const ab = new ArrayBuffer(10);
const buf = Buffer.from(ab, 0, 2);

console.log(buf.length);
// 2 :سيُطبع

سيرمى الخطأ TypeError إن لم يكن المعامل arrayBuffer كائنًا من النوع ArrayBuffer أو  SharedArrayBuffer.

Buffer.from(buffer)‎

أضيف في الإصدار v5.10.0.

  • buffer: ‏<Buffer> | <Uint8Array> نسخةٌ من Buffer أو Unit8Array يراد نسخ البيانات منها.

تنشئ هذه الدالة نسخة Buffer جديدة وتضع فيها نسخةً من محتوى المعامل buffer المعطى.

const buf1 = Buffer.from('buffer');
const buf2 = Buffer.from(buf1);

buf1[0] = 0x61;

console.log(buf1.toString());
// auffer :سيُطبع
console.log(buf2.toString());
// buffer :سيُطبع

سيرمى الخطأ TypeError إن لم يكن المعامل buffer نسخةً من Buffer أو Uint8Array يراد نسخ البيانات منها.

Buffer.from(string[, encoding])‎

أضيف في الإصدار v5.10.0.

  • string: ‏<string> السلسلة النصية المراد ترميزها ووضعها في النسخة Buffer المنشأة.
  • encoding: ‏‏<string> الترميز المراد استعماله مع السلسلة النصية string المعطاة. القيمة الافتراضيَّة هي: 'utf8'.

تنشئ هذه الدالة نسخة Buffer جديدة وتضع فيها السلسلة النصية string المعطاة بعد ترميزها باستعمال الترميز المحدَّد في المعامل encoding.

const buf1 = Buffer.from('this is a tést');
const buf2 = Buffer.from('7468697320697320612074c3a97374', 'hex');

console.log(buf1.toString());
// this is a tést :سيُطبع
console.log(buf2.toString());
// this is a tést :سيُطبع
console.log(buf1.toString('ascii'));
// this is a tC)st :سيُطبع

سيرمى الخطأ TypeError إن لم يكن المعامل string سلسلة نصية.

Buffer.from(object[, offsetOrEncoding[, length]])‎

أضيف في الإصدار v8.2.0.

  • object: ‏<Object> كائنٌ يدعم Symbol.toPrimitive أو valueOf()‎.
  • offsetOrEncoding: ‏<number> | ‏<string> عدد البايتات التي تمثِّل مقدار الإزاحة أو قيمةٌ تمثِّل الترميز المراد استعماله وهذا يعتمد على القيمة التي يعيدها إمَّا object.valueOf()‎ أو object[Symbol.toPrimitive]()‎.
  • length: ‏<number> عدد البايتات المراد نسخها وتعتمد على القيمة التي يعيدها إمَّا object.valueOf()‎ أو object[Symbol.toPrimitive]()‎.

تستعمل هذه الدالة بالشكل Buffer.from(object.valueOf(), offsetOrEncoding, length)‎ من أجل الكائنات التي تعيد الدالة valueOf()‎ معها قيمةً لا تتساوى بشكل صارم مع قيمة المعامل object.

const buf = Buffer.from(new String('this is a test'));
// <Buffer 74 68 69 73 20 69 73 20 61 20 74 65 73 74>

بينما تستعمل بالشكل Buffer.from(object[Symbol.toPrimitive](), offsetOrEncoding, length)‎ من أجل الكائنات التي تدعم Symbol.toPrimitive.

class Foo {
  [Symbol.toPrimitive]() {
    return 'this is a test';
  }
}

const buf = Buffer.from(new Foo(), 'utf8');
// <Buffer 74 68 69 73 20 69 73 20 61 20 74 65 73 74>

Buffer.isBuffer(obj)

أضيف في الإصدار v0.1.101.

  • obj: ‏<Object> الكائن المراد التحقُّق منه إن كان من النوع Buffer أم لا.

تعيد هذه الدالة القيمة المنطقيَّة true إن كان الكائن obj المعطى من النوع Buffer، والقيمة المنطقيَّة false إن لم يكن.

Buffer.isEncoding(encoding)‎

أضيف في الإصدار v0.9.1.

  • encoding: ‏<string> اسم الترميز المراد التحقُّق منه.

يعيد هذا التابع القيمة المنطقيَّة true إن كان الترميز encoding المعطى مدعومًا، أو القيمة المنطقيَّة false إن لم يكن.

الخاصية Buffer.poolSize

أضيفت في الإصدار v0.11.3.

تمثِّل هذه الخاصِّيَّة حجم الذاكرة المحجوزة مسبقًا (بالبايت) للنسخ Buffer الداخلية التي تُستعمَل كمُجمِّع (pooling). قيمتها الافتراضيَّة هي 8192، ويمكن تعديلها.

buf[Index]‎

يمكن استعمال معامل الفهرسة [index] لجلب أو تعيين قيمة بايت واحد موجود في الموقع index ضمن buf. بما أنَّ كل قيمة تمثِّل بايتًا واحدًا، فيجب أن تقع بين المجال 0x00 و 0xFF بالنظام الست عشري أو بين 0 و 255 بالنظام العشري.

إنَّ معامل الفهرسة هذا موروثٌ من Uint8Array، لذا سلوكه مماثل تمامًا للسلوك الذي يسلكه في Uint8Array. هذا يعني أنَّ محاولة الوصول إلى قيمة تقع خارج الحدود يعيد القيمة undefined، ومحاولة ضبط تلك القيمة ليس له أي تأثير.

// بايتًا واحدًا في كل مرة Buffer إلى ASCII نسخ سلسلة نصية بترميز

const str = 'Node.js';
const buf = Buffer.allocUnsafe(str.length);

for (let i = 0; i < str.length; i++) {
  buf[i] = str.charCodeAt(i);
}

console.log(buf.toString('ascii'));
// Node.js :سيُطبع

الخاصية buf.buffer

تعيد الكائن ArrayBuffer بناءً على النوع الذي أنشئ الكائن Buffer منه.

const arrayBuffer = new ArrayBuffer(16);
const buffer = Buffer.from(arrayBuffer);

console.log(buffer.buffer === arrayBuffer);
// true :سيُطبع

buf.compare(target[, targetStart[, targetEnd[, sourceStart[, sourceEnd]]]])‎

سجل التغييرات
الإصدار التغييرات
v8.0.0 أصبح بالإمكان استعمال الكائن Uint8Array مع المعامل target المُمرَّر إلى التابع.
v5.11.0 أضيفت معاملات جديدة لتحديد مجال معين يراد موازنته فقط.
v0.11.13 أضيف هذا التابع.
  • target:‏ <Buffer> | <Uint8Array>  كائنٌ من النوع Buffer أو Uint8Array المراد موازنة buf معه.
  • targetStart: ‏<integer> قيمة الإزاحة من بداية الكائن target التي ستبدأ عندها عمليَّة الموازنة. القيمة الافتراضيَّة هي: 0.
  • targetEnd: ‏<integer> قيمة الإزاحة من نهاية الكائن target التي ستنتهي عندها عمليَّة الموازنة (لا تدخل هذه القيمة ضمن المجال). القيمة الافتراضيَّة هي: target.length.
  • sourceStart: ‏<integer> قيمة الإزاحة ضمن buf من بدايته التي ستبدأ عندها عمليَّة الموازنة. القيمة الافتراضيَّة هي: 0.
  • sourceEnd: ‏<integer> قيمة الإزاحة ضمن buf من نهايته التي ستنتهي عندها عمليَّة الموازنة (لا تدخل هذه القيمة ضمن المجال). القيمة الافتراضيَّة هي: buf.length.

يوازن هذا التابع بين buf و target ثمَّ يعيد عددًا يحدِّد إن كان buf يأتي قبل Buffer أو بعده أو كان مماثلًا له من ناحية الترتيب. تعتمد عمليَّة الموازنة على سلسلة البايتات الفعليَّة في Buffer. يعيد هذا التابع العدد:

  • 0 إن كان target و buf متماثلان، أو
  • 1 إن كان من المفترض أن يأتي target قبل buf عند ترتيبهما، أو
  • ‎-1 إن كان من المفترض أن يأتي target بعد but عند ترتيبهما.
const buf1 = Buffer.from('ABC');
const buf2 = Buffer.from('BCD');
const buf3 = Buffer.from('ABCD');

console.log(buf1.compare(buf1));
// 0
console.log(buf1.compare(buf2));
// -1
console.log(buf1.compare(buf3));
// -1
console.log(buf2.compare(buf1));
// 1
console.log(buf2.compare(buf3));
// 1
console.log([buf1, buf2, buf3].sort(Buffer.compare));
// [ <Buffer 41 42 43>, <Buffer 41 42 43 44>, <Buffer 42 43 44> ]
// ([buf1, buf3, buf2] هذه النتيجة مساوية إلى)

يمكن استعمال المعاملات targetStart، و targetEnd، و sourceStart، و sourceEnd الاختياريَّة لتقليص المجال المراد موازنته إلى مجال محدَّد ضمن target و buf.

const buf1 = Buffer.from([1, 2, 3, 4, 5, 6, 7, 8, 9]);
const buf2 = Buffer.from([5, 6, 7, 8, 9, 1, 2, 3, 4]);

console.log(buf1.compare(buf2, 5, 9, 0, 4));
// 0
console.log(buf1.compare(buf2, 0, 6, 4));
// -1
console.log(buf1.compare(buf2, 5, 6, 5));
// 1

سيرمى الخطأ ERR_INDEX_OUT_OF_RANGE إن كان targetStart < 0، أو sourceStart < 0، أو targetEnd > target.byteLength، أو sourceEnd > source.byteLength.

buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])‎

أضيف في الإصدار v0.1.90.

  • target: ‏<Buffer> | <Uint8Array> كائنٌ من النوع Buffer أو Uint8Array المراد لصق البيانات المنسوخة فيه.
  • targetStart: ‏<integer> قيمة الإزاحة من بداية الكائن target التي ستبدأ عندها عمليَّة الكتابة (اللصق). القيمة الافتراضيَّة هي: 0.
  • sourceStart: ‏<integer> قيمة الإزاحة ضمن buf من بدايته التي ستبدأ عندها عملية النسخ. القيمة الافتراضيَّة هي: 0.
  • sourceEnd: ‏<integer> قيمة الإزاحة ضمن buf من نهايته التي ستتوقف عندها عمليَّة النسخ. القيمة الافتراضيَّة هي: buf.length.

ينسخ هذا التابع بيانات من مجال محدَّد من buf ويلصقها ضمن مجال محدَّد في atrget حتى لو كان مجال الذاكرة المحجوز للكائن target المعطى يتداخل مع buf.

// `Buffer` إنشاء نسختين من
const buf1 = Buffer.allocUnsafe(26);
const buf2 = Buffer.allocUnsafe(26).fill('!');

for (let i = 0; i < 26; i++) {
  // ASCII قيمة المحرف في الجدول 'a' العدد 97 هو
  buf1[i] = i + 97;
}

// بدءًا من البايت 8 `buf2` من 16 إلى 19 ولصقها ضمن `buf1` نسخ بايتات
buf1.copy(buf2, 8, 16, 20);

console.log(buf2.toString('ascii', 0, 25));
// !!!!!!!!qrst!!!!!!!!!!!!! :سيُطبع

buf.entries()‎

أضيف في الإصدار v1.1.0.

ينشئ هذا التابع مُكرِّرًا (iterator) للأزواج [index, byte] من محتويات الكائن buf ثمَّ يعيده.

// `Buffer` إظهار كامل محتوى

const buf = Buffer.from('buffer');

for (const pair of buf.entries()) {
  console.log(pair);
}
// :سيُطبع
//   [0, 98]
//   [1, 117]
//   [2, 102]
//   [3, 102]
//   [4, 101]
//   [5, 114]

buf.equals(otherBuffer)‎

سجل التغييرات
الإصدار التغييرات
v8.0.0 أصبح بالإمكان استعمال الكائن Uint8Array مع المعامل otherBuffer المُمرَّر إلى التابع.
v0.11.13 أضيف هذا التابع.
  • otherBuffer: ‏<Buffer> | <Uint8Array> نسخةٌ من Buffer أو Uint8Array التي يراد موازنتها مع buf.

يعيد هذا التابع القيمة المنطقيَّة true إن كان buf و otherBuffer متساويين بقيمة البايتات نفسها، أو القيمة المنطقيَّة false خلاف ذلك.

const buf1 = Buffer.from('ABC');
const buf2 = Buffer.from('414243', 'hex');
const buf3 = Buffer.from('ABCD');

console.log(buf1.equals(buf2));
// true
console.log(buf1.equals(buf3));
// false

buf.fill(value[, offset[, end]][, encoding])‎

سجل التغييرات
الإصدار التغييرات
v10.0.0 أصبح استعمال قيمة سالبة مع المعامل end يرمي الخطأ ERR_INDEX_OUT_OF_RANGE.
v10.0.0 سيرمى استثناءٌ عند محاولة تبديل قيم صفرية مكان القيم غير الصفرية الموجودة في Buffer.
v10.0.0 سيرمى خطأ عند استعمال سلسلة نصية غير صالحة مع المعامل value.
v5.7.0 أضيف المعامل encoding.
v0.5.0 أضيف هذا التابع.
  • value: ‏<string> | ‏<Buffer>‏‏ | ‏<integer>‏ القيمة المراد وضعها في buf.
  • offset: ‏<integer> عدد البايتات المراد تخطيها في buf قبل البدء بملء النسخة buf بقيمة المعامل value. القيمة الافتراضيَّة هي: 0.
  • end: ‏<integer> عددٌ يمثِّل البايت الذي ستتوقف عنده عملية ملء النسخة buf بقيمة المعامل value (لا يدخل هذا البايت ضمن المجال). القيمة الافتراضيَّة هي: 0.
  • encoding: ‏<string> الترميز المراد استعمال مع المعامل value إن كان سلسلةً نصيةً. القيمة الافتراضيَّة هي: 'utf8'.

يملأ هذا التابع النسخة buf بالقيمة value المعطاة.  إن لم يعطَ المعامل offset أو end أو كلاهما، فستملأ كامل ذاكرة buf بالقيمة value المعطاة:

// ‘h’ بالمحرف Buffer ملء

const b = Buffer.allocUnsafe(50).fill('h');

console.log(b.toString());
// hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh :سيُطبع

ستُحوَّل القيمة value إلى النوع uint32 إن لم تكن سلسلةً نصيةً أو عددًا صحيحًا. عند كتابة محارف متعدِّدة البايتات ووصول التابع fill()‎ إلى عمليَّة الكتابة الأخيرة ولم يعد هنالك حجم كافٍ لكتابة محرف كامل، فستٌكتَب البايتات الأولى من ذلك المحرف التي تتسع في الحجم المتبقي. يشرح المثال التالي هذا الأمر:

// بمحرف يتألف من بايتين `Buffer` ملء

console.log(Buffer.allocUnsafe(3).fill('\u0222'));
// <Buffer c8 a2 c8> :سيُطبع

إن احتوى المعامل value على محارف غير صالحة، فستُقتطَع وتزال؛ وإن لم يعد هنالك بيانات صالحة لملئها، فسيرمى استثناءٌ.

const buf = Buffer.allocUnsafe(5);

console.log(buf.fill('a'));
// <Buffer 61 61 61 61 61> :سيُطبع
console.log(buf.fill('aazz', 'hex'));
// <Buffer aa aa aa aa aa> :سيُطبع
console.log(buf.fill('zz', 'hex'));
// يرمى استثناءٌ

buf.includes(value[, byteOffset][, encoding])‎

أضيف في الإصدار v5.3.0.

  • value: ‏<string> | ‏<Buffer> | ‏<integer> القيمة المراد البحث عنها.
  • byteOffset: ‏<integer> عدد البايتات المراد تخطيها في buf قبل البدء بعمليَّة البحث. القيمة الافتراضيَّة هي: 0.
  • encoding: ‏<string> الترميز المراد استعماله مع المعامل value إن كان سلسلةً نصيةً. القيمة الافتراضيَّة هي: 'utf8'.

يبحث هذا التابع عن القيمة value المعطاة ضمن buf، ويعيد القيمة المنطقيَّة true إن عثر عليها أو القيمة المنطقيَّة إن لم تكن value موجودة في buf.

هذا التابع يكافئ  buf.indexOf() !== -1.

const buf = Buffer.from('this is a buffer');

console.log(buf.includes('this'));
// true
console.log(buf.includes('is'));
// true
console.log(buf.includes(Buffer.from('a buffer')));
// true
console.log(buf.includes(97));
// true (97 is the decimal ASCII value for 'a')
console.log(buf.includes(Buffer.from('a buffer example')));
// false
console.log(buf.includes(Buffer.from('a buffer example').slice(0, 8)));
// true
console.log(buf.includes('this', 4));
// false

buf.indexOf(value[, byteOffset][, encoding])‎

سجل التغييرات
الإصدار التغييرات
v8.0.0 أصبح بالإمكان استعمال الكائن Uint8Array مع المعامل value المُمرَّر إلى التابع.
v5.7.0 - v4.4.0 عندما يُمرَّر المعامل encoding، ليس هنالك حاجة لاستعمال أو تمرير المعامل byteOffset.
v1.5.0 أضيف هذا التابع.
  • value: ‏<string> | ‏<Buffer> | <Uint8Array> | ‏<integer> القيمة المراد البحث عنها.
  • byteOffset: ‏<integer> عدد البايتات المراد تخطيها في buf قبل البدء بعملية البحث. القيمة الافتراضيَّة هي: 0.
  • encoding: ‏<string> إن كان المعامل value المعطى سلسلةً نصيةً، فسيثِّمل هذا المعامل الترميز المراد استعماله لتحديد التمثيل الثنائي لتلك السلسلة النصية الذي سيُبحث عنه في buf. القيمة الافتراضيَّة هي: 'utf8'.

إن كان المعامل value:

  • سلسلةً نصيةً، فسيرمَّز وفقًا للترميز encoding المعطى ثمَّ يبحث عنه.
  • نسخةً من Buffer، أو Uint8Array، فستُسعمَل القيمة value المعطاة بأكملها. إن أردت البحث في جزءٍ محدَّد من Buffer، فاستعمل buf.slice()‎.
  • عددًا، فستعامل القيمة value على أنَّها عددٌ صحيحٌ عديم الإشارة بحجم 8 بت (أي يقع بين 0 و 255).

يعيد هذا التابع عددًا يمثل فهرس البايت الأول للقيمة value لأول ظهور لها في buf، أو القيمة ‎-1 إن لم تكن القيمة value موجودة في buf.

const buf = Buffer.from('this is a buffer');

console.log(buf.indexOf('this'));
// 0
console.log(buf.indexOf('is'));
// 2
console.log(buf.indexOf(Buffer.from('a buffer')));
// 8
console.log(buf.indexOf(97));
// 8 (ASCII في الجدول 'a' العدد 97 هو قيمة المحرف)
console.log(buf.indexOf(Buffer.from('a buffer example')));
// Prints: -1
console.log(buf.indexOf(Buffer.from('a buffer example').slice(0, 8)));
// Prints: 8

const utf16Buffer = Buffer.from('\u039a\u0391\u03a3\u03a3\u0395', 'utf16le');

console.log(utf16Buffer.indexOf('\u03a3', 0, 'utf16le'));
// Prints: 4
console.log(utf16Buffer.indexOf('\u03a3', -4, 'utf16le'));
// Prints: 6

إن يكن المعامل value سلسلةً نصيةً أو عددًا أو نسخةً من Buffer، فسيرمى الخطأ TypeError.

إن كان المعامل value عددًا، فسيحول إلى قيمة بايت صحيح أو إلى عددٍ صحيح يقع في المجال بين 0 و 255.

إن لم يكن المعامل byteOffset عددًا، فسيحول رغمًا عنه إلى عدد. إن حصلنا بعد عمليَّة التحويل هذه على القيمة NaN أو 0، فسيُبحث في buf بأكملها. يطابق هذا السلوك الشكل String.indexOf()‎.

const b = Buffer.from('abcdef');

// تمرير قيمة عدديَّة ولكنها لا تمثل بايتًا صحيحًا
console.log(b.indexOf(99.9));
console.log(b.indexOf(256 + 99));
// 'c' ستُطبع القيمة: 2، وهذا مكافئ للبحث عن العدد 99 أو المحرف

// أو 0 NaN تحول إلى القيمة byteOffset تمرير قيمة للمعامل
console.log(b.indexOf('b', undefined));
console.log(b.indexOf('b', {}));
console.log(b.indexOf('b', null));
console.log(b.indexOf('b', []));
// ستُطبع القيمة 1، إذ جرت عملية البحث في كامل المحتوى

إن كان المعامل value سلسلة نصية فارغة أو نسخة Buffer فارغة وكان المعامل byteOffset أقل من buf.length، فسيُعاد حينئذٍ المعامل byteOffset. أمَّا إن كان المعامل byteOffset أكبر أو يساوي buf.length في نفس شروط الحالة السابقة، فسيُعاد حينئذٍ buf.length.

buf.keys()‎

أضيف في الاصدار v1.1.0.

ينشئ هذا التابع مُكررًا (iterator) لمفاتيح (أو فهارس) الكائن buf ثمَّ يعيده.

const buf = Buffer.from('buffer');

for (const key of buf.keys()) {
  console.log(key);
}
// :سيُطبع
//   0
//   1
//   2
//   3
//   4
//   5

buf.lastIndexOf(value[, byteOffset][, encoding])

سجل التغييرات
الإصدار التغييرات
v8.0.0 أصبح بالإمكان استعمال الكائن Uint8Array مع المعامل value المُمرَّر إلى التابع.
v6.0.0 أضيف هذا التابع.
  • value: ‏<string> | ‏<Buffer> | ‏<Uint8Array> | ‏<integer>‏ القيمة المراد البحث عنها.
  • byteOffset: ‏<integer> عدد البايتات المراد تخطيها في buf قبل البدء بعمليَّة البحث. القيمة الافتراضيَّة هي: buf.length - 1.
  • encoding: ‏<string> إن كان المعامل value المعطى سلسلةً نصيةً، فسيثِّمل هذا المعامل الترميز المراد استعماله لتحديد التمثيل الثنائي لتلك السلسلة النصية الذي سيُبحث عنه في buf. القيمة الافتراضية هي: 'utf8'.

يعيد هذا التابع عددًا يمثِّل فهرس البايت الأول للقيمة value لآخر ظهور لها في buf، أو القيمة ‎-1 إن لم تكن القيمة value موجودة في buf. هذا التابع مماثل تمامًا للتابع buf.indexOf()‎ باستثناء أنَّه يبحث عن آخر ظهور للقيمة value عوضًا عن أول ظهور لها.

const buf = Buffer.from('this buffer is a buffer');

console.log(buf.lastIndexOf('this'));
// 0
console.log(buf.lastIndexOf('buffer'));
// 17
console.log(buf.lastIndexOf(Buffer.from('buffer')));
// 17
console.log(buf.lastIndexOf(97));
// 15 (ASCII في الجدول 'a' العدد 97 هو قيمة المحرف)
console.log(buf.lastIndexOf(Buffer.from('yolo')));
// -1
console.log(buf.lastIndexOf('buffer', 5));
// 5
console.log(buf.lastIndexOf('buffer', 4));
// -1

const utf16Buffer = Buffer.from('\u039a\u0391\u03a3\u03a3\u0395', 'utf16le');

console.log(utf16Buffer.lastIndexOf('\u03a3', undefined, 'utf16le'));
// 6
console.log(utf16Buffer.lastIndexOf('\u03a3', -5, 'utf16le'));
// 4

إن يكن المعامل value سلسلةً نصيةً أو عددًا أو نسخةً من Buffer، فسيُرمى الخطأ TypeError.

إن كان المعامل value عددًا، فسيُحوَّل إلى قيمة بايت صحيح أو إلى عدد صحيح يقع في المجال بين 0 و 255.

إن لم يكن المعامل byteOffset عددًا، فسيحول رغمًا عنه إلى عدد. إن حصلنا بعد عملية التحويل هذه على القيمة NaN (مثل {} أو undefined)، فسيُبحث في buf بأكملها. يطابق هذا السلوك الشكل String.lastIndexOf()‎.

const b = Buffer.from('abcdef');

// تمرير قيمة عددية ولكنها لا تمثِّل بايتًا صحيحًا
console.log(b.lastIndexOf(99.9));
console.log(b.lastIndexOf(256 + 99));
// 'c' ستُطبع القيمة: 2، وهذا مكافئ للبحث عن العدد 99 أو المحرف

// NaN تحول إلى القيمة byteOffset تمرير قيمة للمعامل
console.log(b.lastIndexOf('b', undefined));
console.log(b.lastIndexOf('b', {}));
// ستُطبع القيمة 1، إذ جرت عمليَّة البحث في كامل المحتوى


// تحول إلى القيمة 0 byteOffset تمرير قيمة للمعامل
console.log(b.lastIndexOf('b', null));
console.log(b.lastIndexOf('b', []));
// ستُطبع القيمة -1، وهذا يكافئ تمرير القيمة 0

إن كان المعامل value سلسلةً نصيةً فارغةً أو نسخة Buffer فارغة، فستُعاد حينئذٍ قيمة المعامل byteOffset.

الخاصية buf.length

أضيف في الاصدار v0.1.90.

تعيد هذه الخاصِّيَّة حجم الذاكرة المحجوز للنسخة buf بواحدة البايت. انتبه إلى أنَّ هذا الحجم لا يمثِّل بالضرورة حجم الذاكرة المستهلكة ضمن buf.

// عليها ASCII ثمَّ كتابة سلسلة نصية بترميز Buffer إنشاء نسخة جديدة

const buf = Buffer.alloc(1234);

console.log(buf.length);
// سيُطبع: 1234

buf.write('some string', 0, 'ascii');

console.log(buf.length);
// سيُطبع 1234

لمَّا كانت الخاصِّيَّة length غير ثابتة، فيمكن أن يؤدي تغيير قيمتها إلى الحصول على سلوك غير مُعرَّف وغير منتظم. يجب على التطبيقات التي ترغب بتعديل حجم نسخةٍ من Buffer أن تعامل الخاصِّيَّة length كقيمة قابلة للقراءة فقط، وأن تستعمل buf.slice()‎ لاقتطاع جزءٍ من Buffer.

let buf = Buffer.allocUnsafe(10);

buf.write('abcdefghj', 0, 'ascii');

console.log(buf.length);
// 10

buf = buf.slice(0, 5);

console.log(buf.length);
// 5

الخاصية buf.parent

أضيف في الإصدار v8.0.0.

الاستقرار: 0-مهمل: استعمل الخاصِّيَّة buf.buffer عوضًا عنها.

هذه الخاصِّيَّة هي اسمٌ بديلٌ مهمل للخاصِّيَّة buf.buffer.

buf.readDoubleBE(offset)‎، و buf.readDoubleLE(offset)‎

سجل التغييرات
الإصدار التغييرات
v10.0.0 حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
v0.11.15 أضيف هذا التابع.
  • offset: ‏<integer> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال ‎0 <= offset <= buf.length - 8.

يقرأ هذا التابع الأعداد العشريَّة المضاعفة (double) ذات الحجم 64 بت من buf بدءًا من البايت offset المعطى مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة ثمَّ يعيدها. إن كانت البتات الأقل أهميَّة مُخزَّنة أولًا (big endian)، فاستعمل readDoubleBE()‎؛ وإن كانت البتات الأكثر أهميَّة مُخزَّنة أولًا (little endian)، فاستعمل readDoubleLE()‎.

const buf = Buffer.from([1, 2, 3, 4, 5, 6, 7, 8]);

console.log(buf.readDoubleBE(0));
// 8.20788039913184e-304
console.log(buf.readDoubleLE(0));
// 5.447603722011605e-270
console.log(buf.readDoubleLE(1));
// ERR_OUT_OF_RANGE يرمى الخطأ

buf.readFloatBE(offset)‎ و buf.readFloatLE(offset)‎

الإصدار التغييرات
v10.0.0 حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
v0.11.15 أضيف هذا التابع.
  • offset: ‏<integer> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة، ويجب أن تقع القيمة المعطاة بين المجال ‎0 <= offset <= buf.length - 4.

يقرأ هذا التابع الأعداد العشرية (float) ذات الحجم 32 بت من buf بدءًا من البايت offset المعطى مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة ثمَّ يعيدها. إن كانت البتات الأقل أهميَّة مُخزَّنة أولًا (big endian)، فاستعمل readFloatBE()‎؛ وإن كانت البتات الأكثر أهمية مُخزَّنة أولًا (little endian)، فاستعمل readFloatLE()‎.

const buf = Buffer.from([1, 2, 3, 4]);

console.log(buf.readFloatBE(0));
// Prints: 2.387939260590663e-38
console.log(buf.readFloatLE(0));
// Prints: 1.539989614439558e-36
console.log(buf.readFloatLE(1));
// ERR_OUT_OF_RANGE يرمى الخطأ

buf.readInt8(offset)‎

سجل التغييرات
الإصدار التغييرات
v10.0.0 حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
v0.5.0 أضيف هذا التابع.
  • offset: ‏<integer> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة، ويجب أن تقع القيمة المعطاة بين المجال ‎0 <= offset <= buf.length - 1.

يقرأ هذا التابع الأعداد الصحيحة ذات الإشارة (signed integer) التي حجمها 8 بت من buf بدءًا من البايت offset المعطى ثمَّ يعيدها.

تفسَّر الأعداد الصحيحة المقروءة من نسخة Buffer على أنَّها قيمٌ متمِّمة ثنائيًّا (two's complement) وذات إشارة.

const buf = Buffer.from([-1, 5]);

console.log(buf.readInt8(0));
// Prints: -1
console.log(buf.readInt8(1));
// Prints: 5
console.log(buf.readInt8(2));
// ERR_OUT_OF_RANGE يرمى الخطأ

buf.readInt16BE(offset)‎ و buf.readInt16LE(offset)‎

سجل التغييرات
الإصدار التغييرات
v10.0.0 حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
v0.5.5 أضيف هذا التابع.
  • offset: ‏<integer> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة، ويجب أن تقع القيمة المعطاة بين المجال ‎0 <= offset <= buf.length - 2.

يقرأ هذا التابع الأعداد الصحيحة ذات الإشارة (signed integer) التي حجمها 16 بت من buf بدءًا من البايت offset المعطى مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزنة أولًا في الذاكرة ثمَّ يعيدها. إن كانت البتات الأقل أهميَّة مُخزَّنة أولًا (big endian)، فاستعمل readInt16BE()‎؛ وإن كانت البتات الأكثر أهمية مُخزَّنة أولًا (little endian)، فاستعمل readInt16LE()‎.

تفسَّر الأعداد الصحيحة المقروءة من نسخة Buffer على أنَّها قيمٌ متمِّمة ثنائيًّا (two's complement) وذات إشارة.

const buf = Buffer.from([1, 2, 3, 4]);
const buf = Buffer.from([0, 5]);

console.log(buf.readInt16BE(0));
// Prints: 5
console.log(buf.readInt16LE(0));
// Prints: 1280
console.log(buf.readInt16LE(1));
// ERR_OUT_OF_RANGE يرمى الخطأ

buf.readInt32BE(offset)‎ و buf.readInt32LE(offset)

سجل التغييرات
الإصدار التغييرات
v10.0.0 حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
v0.5.5 أضيف هذا التابع.
  • offset: ‏<integer> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة، ويجب أن تقع القيمة المعطاة بين المجال ‎0 <= offset <= buf.length - 4.

يقرأ هذا التابع الأعداد الصحيحة ذات الإشارة (signed integer) التي حجمها 32 بت من buf بدءًا من البايت offset المعطى مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة ثمَّ يعيدها. إن كانت البتات الأقل أهمية مُخزَّنة أولًا (big endian)، فاستعمل readInt32BE()‎؛ وإن كانت البتات الأكثر أهمية مُخزَّنة أولًا (little endian)، فاستعمل readInt32LE()‎.

تفسَّر الأعداد الصحيحة المقروءة من نسخة Buffer على أنَّها قيم متمِّمة ثنائيًّا (two's complement) وذات إشارة.

const buf = Buffer.from([0, 0, 0, 5]);

console.log(buf.readInt32BE(0));
// Prints: 5
console.log(buf.readInt32LE(0));
// Prints: 83886080
console.log(buf.readInt32LE(1));
// ERR_OUT_OF_RANGE يرمى الخطأ

buf.readIntBE(offset, byteLength)‎ و buf.readIntLE(offset, byteLength)‎

سجل التغييرات
الإصدار التغييرات
v10.0.0 حُذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset والمعامل byteLength إلى النوع uint32 ضمنيًّا بعد الآن.
v0.11.15 أضيف هذا التابع.
  • offset: ‏<integer> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة، ويجب أن تقع قيمة هذا المعامل في المجال ‎0 <= offset <= buf.length - byteLength.
  • byteLength: ‏<integer> عدد البايتات المراد قراءتها، ويجب أن تقع بين قيمة هذا المعامل في المجال 0‎ < byteLength <= 6.

يقرأ هذا التابع الأعداد الصحيحة ذات الإشارة (signed integer) التي حجمها هو byteLength المعطى من buf بدءًا من البايت offset المعطى مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة ثمَّ يعيدها. إن كانت البتات الأقل أهمية مُخزَّنة أولًا (big endian)، فاستعمل readIntBE()‎؛ وإن كانت البتات الأكثر أهمية مُخزَّنة أولًا (little endian)، فاستعمل readIntLE()‎.

تفسَّر الأعداد الصحيحة المقروءة من نسخة Buffer على أنَّها قيم متمِّمة ثنائيًّا (two's complement) وذات إشارة. تدعم هذه الدالة قراءة الأعداد الصحيحة بدقة تصل إلى 48 بت.

const buf = Buffer.from([0, 0, 0, 5]);

const buf = Buffer.from([0x12, 0x34, 0x56, 0x78, 0x90, 0xab]);

console.log(buf.readIntLE(0, 6).toString(16));
// -546f87a9cbee
console.log(buf.readIntBE(0, 6).toString(16));
// 1234567890ab
console.log(buf.readIntBE(1, 6).toString(16));
// ERR_INDEX_OUT_OF_RANGE يرمى الخطأ
console.log(buf.readIntBE(1, 0).toString(16));
// ERR_OUT_OF_RANGE يرمى الخطأ

buf.readUInt8(offset)‎

سجل التغييرات
الإصدار التغييرات
v10.0.0 حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
v0.5.0 أضيف هذا التابع.
  • offset: ‏<integer> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة، ويجب أن تقع قيمة هذا المعامل في المجال ‎0 <= offset <= buf.length - 1.

يقرأ هذا التابع الأعداد الصحيحة عديمة الإشارة (unsigned integer) ذات الحجم 8 بت من buf بدءًا من البايت offset المعطى ثمَّ يعيدها.

const buf = Buffer.from([-1, 5]);

console.log(buf.readInt8(0));
// Prints: -1
console.log(buf.readInt8(1));
// Prints: 5
console.log(buf.readInt8(2));
// ERR_OUT_OF_RANGE يرمى الخطأ

buf.readUInt16BE(offset)‎ و buf.readUInt16LE(offset)‎

سجل التغييرات
الإصدار التغييرات
v10.0.0 حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
v0.5.5 أضيف هذا التابع.
  • offset: ‏<integer> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة، ويجب أن تقع القيمة المعطاة بين المجال ‎0 <= offset <= buf.length - 2.

يقرأ هذا التابع الأعداد الصحيحة عديمة الإشارة (unsigned integer) ذات الحجم 16 بت من buf بدءًا من البايت offset المعطى مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة ثمَّ يعيدها. إن كانت البتات الأقل أهميَّة مُخزَّنة أولًا (big endian)، فاستعمل readUInt16BE()‎؛ وإن كانت البتات الأكثر أهميَّة مُخزَّنة أولًا (little endian)، فاستعمل readUInt16LE()‎.

const buf = Buffer.from([0x12, 0x34, 0x56]);

console.log(buf.readUInt16BE(0).toString(16));
// Prints: 1234
console.log(buf.readUInt16LE(0).toString(16));
// Prints: 3412
console.log(buf.readUInt16BE(1).toString(16));
// Prints: 3456
console.log(buf.readUInt16LE(1).toString(16));
// Prints: 5634
console.log(buf.readUInt16LE(2).toString(16));
// ERR_OUT_OF_RANGE يرمى الخطأ

buf.readUInt32BE(offset)‎ و buf.readUInt32LE(offset)‎

سجل التغييرات
الإصدار التغييرات
v10.0.0 حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
v0.5.5 أضيف هذا التابع.
  • offset: ‏<integer> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة، ويجب أن تقع القيمة المعطاة بين المجال ‎0 <= offset <= buf.length - 4.

يقرأ هذا التابع الأعداد الصحيحة عديمة الإشارة (unsigned integer) ذات الحجم 32 بت من buf بدءًا من البايت offset المعطى مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة ثمَّ يعيدها. إن كانت البتات الأقل أهمية مُخزَّنة أولًا (big endian)، فاستعمل readUInt32BE()‎؛ وإن كانت البتات الأكثر أهمية مُخزَّنة أولًا (little endian)، فاستعمل readUInt32LE()‎.

تُفسَّر الأعداد الصحيحة المقروءة من نسخة Buffer على أنَّها قيم متمِّمة ثنائيًّا (two's complement) وعديمة الإشارة.

const buf = Buffer.from([0x12, 0x34, 0x56, 0x78]);

console.log(buf.readUInt32BE(0).toString(16));
// Prints: 12345678
console.log(buf.readUInt32LE(0).toString(16));
// Prints: 78563412
console.log(buf.readUInt32LE(1).toString(16));
// ERR_OUT_OF_RANGE يرمى الخطأ

buf.readUIntBE(offset, byteLength)‎ و buf.readUIntLE(offset, byteLength)‎

سجل التغييرات
الإصدار التغييرات
v10.0.0 حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset والمعامل byteLength إلى النوع uint32 ضمنيًّا بعد الآن.
v0.11.15 أضيف هذا التابع.
  • offset: ‏<integer> عدد البايتات المراد تخطيها قبل البدء بعملية القراءة، ويجب أن تقع قيمة هذا المعامل في المجال ‎0 <= offset <= buf.length - byteLength.
  • byteLength: ‏<integer> عدد البايتات المراد قراءتها، ويجب أن تقع قيمة هذا المعامل في المجال ‎0 < byteLength <= 6.

يقرأ هذا التابع الأعداد الصحيحة عديمة الإشارة ذات الحجم byteLength المعطى من buf بدءًا من البايت offset المعطى مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة ثمَّ يعيدها. إن كانت البتات الأقل أهميَّة مُخزَّنة أولًا (big endian)، فاستعمل readUIntBE()‎؛ وإن كانت البتات الأكثر أهمية مُخزَّنة أولًا (little endian)، فاستعمل readUIntLE()‎.

تفسَّر الأعداد الصحيحة المقروءة من نسخة Buffer على أنَّها قيم متمِّمة ثنائيًّا (two's complement) وعديمة الإشارة. تدعم هذه الدالة قراءة الأعداد الصحيحة بدقة تصل إلى 48 بت.

const buf = Buffer.from([0x12, 0x34, 0x56, 0x78, 0x90, 0xab]);

console.log(buf.readUIntBE(0, 6).toString(16));
// Prints: 1234567890ab
console.log(buf.readUIntLE(0, 6).toString(16));
// Prints: ab9078563412
console.log(buf.readUIntBE(1, 6).toString(16));
// ERR_OUT_OF_RANGE يرمى الخطأ

buf.slice([start[, end]])‎

سجل التغييرات
الإصدار التغييرات
v7.1.0 - v6.9.2 أصبح تحويل قيمة المعامل start والمعامل end إلى أعداد صحيحة يدعم قيمًا ذات دقة أكبر من 32 بت.
v7.0.0 يُحوَّل الآن المعامل start والمعامل end إلى أعداد صحيحة قبل بدء إجراء أية عمليَّة حسابيَّة عليهما.
v0.3.0 أضيف هذا التابع.
  • start: ‏<integer> عددٌ يمثل فهرس البايت الذي يُحدَّد بداية الجزء المراد اقتطاعه من كائن Buffer معيَّن.
  • end: ‏<integer> عددٌ يمثل فهرس البايت الذي يُحدِّد نهاية الجزء المراد اقتطاعه من كائن Buffer معيَّن (لا يدخل هذا البايت ضمن الجزء المقتطع).

يعيد هذا التابع كائن Buffer جديد يتشارك جزء الذاكرة المحجوز نفسه مع الكائن Buffer الأصلي باستنثاء أنَّه يقتطع ذلك الجزء عبر تحديد بدايته ونهايته.

إعطاء قيمة للمعامل end أكبر من القيمة buf.length سيعيد النتيجة نفسها فيما لو كانت قيمة هذا المعامل مساويةً إلى buf.length.

تعديل الكائن Buffer المقتطع سيؤدي إلى تعديل جزء الذاكرة المخصص للكائن buffer الأصلي بسبب تداخل جزء الذاكرة المحجوز لكلٍّ منهما.

// فيه، ثمَّ اقتطاع جزء منه، ثمَّ تعديل ASCII جديد ووضع بعض محارف Buffer إنشاء كائن 
// الأصلي Buffer بايت واحد من الكائن

const buf1 = Buffer.allocUnsafe(26);

for (let i = 0; i < 26; i++) {
  // ASCII في الجدول 'a' العدد 97 هو قيمة المحرف
  buf1[i] = i + 97;
}

const buf2 = buf1.slice(0, 3);

console.log(buf2.toString('ascii', 0, buf2.length));
// abc :سيُطبع

buf1[0] = 33;

console.log(buf2.toString('ascii', 0, buf2.length));
// !bc :سيُطبع

استعمال قيمٍ سالبةٍ مع المعامل start أو المعامل end يؤدي إلى تحديد فهرس البايت -الذي يعين بداية أو نهاية الجزء المراد اقتطاعه- بدءًا من نهاية الكائن buf بدلًا من بدايته.

const buf = Buffer.from('buffer');

console.log(buf.slice(-6, -1).toString());
// buffe :سيُطبع
// (Equivalent to buf.slice(0, 5))

console.log(buf.slice(-6, -2).toString());
// buff :سيُطبع
// (Equivalent to buf.slice(0, 4))

console.log(buf.slice(-5, -2).toString());
// uff :سيُطبع
// (Equivalent to buf.slice(1, 4))

buf.swap16()‎

أضيف في الإصدار v5.10.0.

يفسِّر هذا التابع الكائن buf المُعطى على أنَّه مصفوفةٌ لأعداد صحيحة عديمة الإشارة بحجم 16 بت ويعكس ترتيب بايتي كلِّ عدد في مكانهما ثمَّ يعيد ذلك الكائن.

سيُرمَى الخطأ ERR_INVALID_BUFFER_SIZE إن لم تكن قيمة buf.length من مضاعفات العدد 2.

const buf1 = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8]);

console.log(buf1);
// <Buffer 01 02 03 04 05 06 07 08> :سيُطبع

buf1.swap16();

console.log(buf1);
// <Buffer 02 01 04 03 06 05 08 07> :سيُطبع

const buf2 = Buffer.from([0x1, 0x2, 0x3]);

buf2.swap16();
// ERR_INVALID_BUFFER_SIZE سيرمى الخطأ

buf.swap32()‎

أضيف في الإصدار v5.10.0.

يُفسِّر هذا التابع الكائن buf المعطى على أنَّه مصفوفةٌ لأعداد صحيحة عديمة الإشارة بحجم 32 بت ويعكس ترتيب البايتات الأربعة لكل عدد في مكانهما ثمَّ يعيد ذلك الكائن.

سيُرمى الخطأ ERR_INVALID_BUFFER_SIZE إن لم تكن قيمة buf.length من مضاعفات العدد 4.

const buf1 = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8]);

console.log(buf1);
// <Buffer 01 02 03 04 05 06 07 08> :سيُطبع

buf1.swap32();

console.log(buf1);
// <Buffer 04 03 02 01 08 07 06 05> :سيُطبع

const buf2 = Buffer.from([0x1, 0x2, 0x3]);

buf2.swap32();
// ERR_INVALID_BUFFER_SIZE سيرمى الخطأ

buf.swap64()‎

أضيف في الإصدار v6.3.0.

يُفسِّر هذا التابع الكائن buf المعطى على أنَّه مصفوفةٌ لأعداد صحيحة عديمة الإشارة بحجم 64 بت ويعكس ترتيب البايتات الأربعة لكل عدد في مكانهما ثمَّ يعيد ذلك الكائن.

سيُرمَى الخطأ ERR_INVALID_BUFFER_SIZE إن لم تكن قيمة buf.length من مضاعفات العدد 8.

const buf1 = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8]);

console.log(buf1);
// <Buffer 01 02 03 04 05 06 07 08> :سيُطبع

buf1.swap64();

console.log(buf1);
// <Buffer 08 07 06 05 04 03 02 01> :سيُطبع

const buf2 = Buffer.from([0x1, 0x2, 0x3]);

buf2.swap64();
// ERR_INVALID_BUFFER_SIZE سيرمى الخطأ

انتبه إلى أنَّ JavaScript لا تستطيع أن ترمِّز أعداد صحيحة بحجم 64 بت حاليًّا، لذا يستعمل هذا التابع مع الأعداد العشرية (floats) ذات الحجم 64 بت.

buf.toJSON()‎

أضيف في الإصدار v0.9.2.

يحوِّل هذا التابع محتويات النسخة buf إلى صيغة JSON ثمَّ يعيدها في كائن من النوع Object. يستدعى هذا التابع ضمنيًّا عند استدعاء JSON.stringify()‎ لتحويل نسخة Buffer.

const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
const json = JSON.stringify(buf);

console.log(json);
// {"type":"Buffer","data":[1,2,3,4,5]} :سيُطبع

const copy = JSON.parse(json, (key, value) => {
  return value && value.type === 'Buffer' ?
    Buffer.from(value.data) :
    value;
});

console.log(copy);
// <Buffer 01 02 03 04 05> :سيُطبع

buf.toString([encoding[, start[, end]]])‎

أضيف في الإصدار v0.1.90.

  • encoding: ‏<string> سلسلة نصية تحدِّد ترميز المحارف المراد استعماله. القيمة الافتراضيَّة هي: 'utf8'.
  • start:‏ <string> عددٌ يمثل فهرس البايت الذي ستبدأ عمليَّة فك الترميز عنده. القيمة الافتراضيَّة هي: 0.
  • end: ‏<string> عددٌ يمثل فهرس البايت الذي ستنتهي عمليَّة فك الترميز عنده (لا يدخل هذا البايت ضمن المجال). القيمة الافتراضيَّة هي: buf.length.

يفك هذا التابع ترميز كائن buf معيَّن إلى سلسلة نصية وفقًا للترميز encoding المعطى. يمكن فك ترميز جزء معيَّن فقط من buf عبر تمرير قيمةٍ للمعامل start والمعامل end.

الطول الأعظمي لنسخةٍ من سلسلةٍ نصيةٍ (في واحدات الترميز UTF-16) متاحٌ عبر buffer.constants.MAX_STRING_LENGTH.

const buf1 = Buffer.allocUnsafe(26);

for (let i = 0; i < 26; i++) {
  // ASCII في الجدول 'a' العدد 97 هو قيمة المحرف
  buf1[i] = i + 97;
}

console.log(buf1.toString('ascii'));
// abcdefghijklmnopqrstuvwxyz
console.log(buf1.toString('ascii', 0, 5));
// abcde

const buf2 = Buffer.from('tést');

console.log(buf2.toString('hex'));
// 74c3a97374
console.log(buf2.toString('utf8', 0, 3));
// té
console.log(buf2.toString(undefined, 0, 3));
// té

buf.values()‎

أضيف في الإصدار v1.1.0.

ينشئ هذا التابع مُكررًا (iterator) لقيم (بايتات) الكائن buf ثمَّ يعيده. يستدعى هذا التابع تلقائيًّا عند استعمال كائن buffer في الحلقة for..of التكرارية.

const buf = Buffer.from('buffer');

for (const value of buf.values()) {
  console.log(value);
}
// :سيُطبع
//   98
//   117
//   102
//   102
//   101
//   114

for (const value of buf) {
  console.log(value);
}
// :سيُطبع
//   98
//   117
//   102
//   102
//   101
//   114

buf.write(string[, offset[, length]][, encoding])‎

أضيف في الإصدار v0.1.90.

  • string: ‏<string> السلسلة النصية المراد كتابتها في الكائن buf.
  • offset: ‏<integer> عدد البايتات المراد تخطيها قبل بدء كتابة السلسلة النصية string. القيمة الافتراضيَّة هي: 0.
  • length: ‏<integer> عدد البايتات المراد كتابتها. القيمة الافتراضيَّة هي: buf.length - offset.
  • encoding:‏ <string> ترميز السلسلة النصية string المراد كتابتها. القيمة الافتراضيَّة هي: 'utf8'.

يكتب هذا التابع السلسلة النصية string المعطاة في الكائن buf عند البايت offset بعد ترميزها وفقًا للترميز encoding المحدَّد. يعيد بعدئذٍ عدد البايتات التي كُتبَت.

إن لم يحتوي الكائن buf على مساحة كافية تتسع السلسلة النصية string، فسيُكتَب قسمٌ من تلك السلسلة بحسب المساحة المتوافرة.

const buf = Buffer.alloc(256);

const len = buf.write('\u00bd + \u00bc = \u00be', 0);

console.log(`${len} bytes: ${buf.toString('utf8', 0, len)}`);
// 12 bytes: ½ + ¼ = ¾

buf.writeDoubleBE(value, offset)‎ و buf.writeDoubleLE(value, offset)

سجل التغييرات
الإصدار التغييرات
v10.0.0 حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
v0.11.15 أضيف هذا التابع.
  • value: ‏<number> عددٌ عشري مضاعف (double) بحجم 64 بت يراد كتابته في كائن buf معيَّن.
  • offset: ‏<number> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال  ‎0 <= offset <= buf.length - 8.

يكتب هذا التابع قيمة المعامل value المعطى في buf بدءًا من البايت offset مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة. يعيد التابع بعدئذٍ عدد البايتات المكتوبة مضافًا إليه قيمة المعامل offset. إن كنت تريد كتابة البتات الأقل أهمية أولًا (big endian)، فاستعمل writeDoubleBE()‎؛ وإن كنت تريد كتابة البتات الأكثر أهمية أولًا (little endian)، فاستعمل writeDoubleLE()‎.

يجب أن يكون المعامل value عددًا عشريًا مضاعفًا بحجم 64 بت، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.

buf.writeFloatBE(value, offset)‎ و buf.writeFloatLE(value, offset)‎

سجل التغييرات
الإصدار التغييرات
v10.0.0 حُذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
v0.11.15 أضيف هذا التابع.
  • value: ‏<number> عددٌ عشري (float) بحجم 32 بت يراد كتابته في كائن buf معيَّن.
  • offset: ‏<number> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال  ‎0 <= offset <= buf.length - 4.

يكتب هذا التابع قيمة المعامل value المعطى في buf بدءًا من البايت offset مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة. يعيد التابع بعدئذٍ عدد البايتات المكتوبة مضافًا إليه قيمة المعامل offset. إن كنت تريد كتابة البتات الأقل أهمية أولًا (big endian)، فاستعمل writeFloatBE()‎؛ وإن كنت تريد كتابة البتات الأكثر أهمية أولًا (little endian)، فاستعمل writeFloatLE()‎.

يجب أن يكون المعامل value عددًا عشريًا بحجم 32 بت، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.

const buf = Buffer.allocUnsafe(4);

buf.writeFloatBE(0xcafebabe, 0);

console.log(buf);
// <Buffer 4f 4a fe bb> :سيُطبع

buf.writeFloatLE(0xcafebabe, 0);

console.log(buf);
// <Buffer bb fe 4a 4f> :سيُطبع

buf.writeInt8(value, offset)‎

سجل التغييرات
الإصدار التغييرات
v10.0.0 حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
v0.5.0 أضيف هذا التابع.
  • value: ‏<number> عددٌ صحيح ذو إشارة (signed integer) بحجم 8 بت يراد كتابته في كائن buf معيَّن.
  • offset: ‏<number> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال  ‎0 <= offset <= buf.length - 1.

يكتب هذا التابع قيمة المعامل value المعطى في buf بدءًا من البايت offset ثمَّ يعيد عدد البايتات المكتوبة مضافًا إليه قيمة المعامل offset.

يجب أن يكون المعامل value عددًا صحيحًا ذي إشارة بحجم 8 بت، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.

يُفسَّر العدد الصحيح المراد كتابته على أنَّه متممٌ ثنائيٌ (two's complement) وله إشارة.

const buf = Buffer.allocUnsafe(2);

buf.writeInt8(2, 0);
buf.writeInt8(-2, 1);

console.log(buf);
// <Buffer 02 fe> :سيُطبع

buf.writeInt16BE(value, offset)‎ و buf.writeInt16LE(value, offset)‎

  • value: ‏<number> عدد صحيح ذو إشارة (signed integer) بحجم 16 بت يراد كتابته في كائن buf معيَّن.
  • offset: ‏<number> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال  ‎0 <= offset <= buf.length - 2.

يكتب هذا التابع قيمة المعامل value المعطى في buf بدءًا من البايت offset مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة. يعيد التابع بعدئذٍ عدد البايتات المكتوبة مضافًا إليه قيمة المعامل offset. إن كنت تريد كتابة البتات الأقل أهمية أولًا (big endian)، فاستعمل writeInt16BE()‎؛ وإن كنت تريد كتابة البتات الأكثر أهمية أولًا (little endian)، فاستعمل writeInt16LE()‎.

يجب أن يكون المعامل value عددًا صحيحًا ذي إشارة بحجم 16 بت، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.

يفسَّر العدد الصحيح المراد كتابته على أنَّه متممٌ ثنائيٌ (two's complement) وله إشارة.

const buf = Buffer.allocUnsafe(4);

buf.writeInt16BE(0x0102, 0);
buf.writeInt16LE(0x0304, 2);

console.log(buf);
// <Buffer 01 02 04 03> :سيُطبع

buf.writeInt32BE(value, offset)‎ و buf.writeInt32LE(value, offset)‎

سجل التغييرات
الإصدار التغييرات
v10.0.0 حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
v0.5.5 أضيف هذا التابع.
  • value:‏ <number> عددٌ صحيحٌ ذو إشارة (signed integer) بحجم 32 بت يراد كتابته في كائن buf معيَّن.
  • offset: ‏<number> عدد البايتات المراد تخطيها قبل البدء بعملية القراءة. ويجب أن تقع القيمة المعطاة بين المجال ‎0 <= offset <= buf.length - 4.

يكتب هذا التابع قيمة المعامل value المعطى في buf بدءًا من البايت offset مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة. يعيد التابع بعدئذٍ عدد البايتات المكتوبة مضافًا إليه قيمة المعامل offset. إن كنت تريد كتابة البتات الأقل أهمية أولًا (big endian)، فاستعمل writeInt32BE()‎؛ وإن كنت تريد كتابة البتات الأكثر أهمية أولًا (little endian)، فاستعمل writeInt32LE()‎.

يجب أن يكون المعامل value عددًا صحيحًا ذي إشارة بحجم 32 بت، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.

يفسَّر العدد الصحيح المراد كتابته على أنَّه متممٌ ثنائيٌ (two's complement) وله إشارة.

const buf = Buffer.allocUnsafe(8);

buf.writeInt32BE(0x01020304, 0);
buf.writeInt32LE(0x05060708, 4);

console.log(buf);
// <Buffer 01 02 03 04 08 07 06 05> :سيُطبع

buf.writeIntBE(value, offset, byteLength)‎ و buf.writeIntLE(value, offset, byteLength)‎

سجل التغييرات
الإصدار التغييرات
v10.0.0 حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
v0.11.15 أضيف هذا التابع.
  • value: ‏<number> عددٌ صحيحٌ ذو إشارة (signed integer) يراد كتابته في كائن buf معيَّن.
  • offset: ‏<number> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال ‎0 <= offset <= buf.length - byteLength.
  • byteLength: ‏<integer> عدد البايتات المراد كتابتها. يجب أن تقع قيمة هذا المعامل في المجال ‎0 < byteLength <= 6.

يكتب هذا التابع عددًا محددًا من بايتات المعامل value المعطى في buf بدءًا من البايت offset ثمَّ يعيد عدد البايتات المكتوبة مضافًا إليه قيمة المعامل offset.

يدعم هذا التابع الأعداد الصحيحة ذات الإشارة بدقة تصل إلى 48 بت. يجب أن يكون المعامل value عددًا صحيحًا ذي إشارة، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.

const buf = Buffer.allocUnsafe(6);

buf.writeIntBE(0x1234567890ab, 0, 6);

console.log(buf);
// <Buffer 12 34 56 78 90 ab> :سيُطبع

buf.writeIntLE(0x1234567890ab, 0, 6);

console.log(buf);
// <Buffer ab 90 78 56 34 12> :سيُطبع

buf.writeUInt8(value, offset)‎

سجل التغييرات
الإصدار التغييرات
v10.0.0 حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
v0.5.0 أضيف هذا التابع.
  • value: ‏<number> عددٌ صحيحٌ عديم الإشارة (unsigned integer) بحجم 8 بت يراد كتابته في كائن buf معيَّن.
  • offset: ‏<number> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال ‎0 <= offset <= buf.length - 1.

يكتب هذا التابع قيمة المعامل value المعطى في buf بدءًا من البايت offset ثمَّ يعيد عدد البايتات المكتوبة مضافًا إليه قيمة المعامل offset.

يجب أن يكون المعامل value عددًا صحيحًا عديم الإشارة بحجم 8 بت، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.

const buf = Buffer.allocUnsafe(4);

buf.writeUInt8(0x3, 0);
buf.writeUInt8(0x4, 1);
buf.writeUInt8(0x23, 2);
buf.writeUInt8(0x42, 3);

console.log(buf);
// <Buffer 03 04 23 42> :سيُطبع

buf.writeUInt16BE(value, offset)‎ و buf.writeUInt16LE(value, offset)‎

الإصدار التغييرات
v10.0.0 حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
v0.5.5 أضيف هذا التابع.
  • value: ‏<number> عددٌ صحيحٌ عديم الإشارة (unsigned integer) بحجم 16 بت يراد كتابته في كائن buf معين.
  • offset: ‏<number> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال ‎0 <= offset <= buf.length - 2.

يكتب هذا التابع قيمة المعامل value المعطى في buf بدءًا من البايت offset مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة. يعيد التابع بعدئذٍ عدد البايتات المكتوبة مضافًا إليه قيمة المعامل offset. إن كنت تريد كتابة البتات الأقل أهمية أولًا (big endian)، فاستعمل writeUInt16BE()‎؛ وإن كنت تريد كتابة البتات الأكثر أهمية أولًا (little endian)، فاستعمل writeUInt16LE()‎.

يجب أن يكون المعامل value عددًا صحيحًا عديم الإشارة بحجم 16 بت، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.

const buf = Buffer.allocUnsafe(4);

buf.writeUInt16BE(0xdead, 0);
buf.writeUInt16BE(0xbeef, 2);

console.log(buf);
// <Buffer de ad be ef> :سيُطبع

buf.writeUInt16LE(0xdead, 0);
buf.writeUInt16LE(0xbeef, 2);

console.log(buf);
// <Buffer ad de ef be> :سيُطبع

buf.writeUInt32BE(value, offset)‎ و buf.writeUInt32LE(value, offset)‎

الإصدار التغييرات
v10.0.0 حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
v0.5.5 أضيف هذا التابع.
  • value: ‏<number> عددٌ صحيحٌ عديم الإشارة (unsigned integer) بحجم 32 بت يراد كتابته في كائن buf معيَّن.
  • offset: ‏<number> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال ‎0 <= offset <= buf.length - 4.

يكتب هذا التابع قيمة المعامل value المعطى في buf بدءًا من البايت offset مع مراعاة التنسيق المستعمل في ترتيب البتات المُخزَّنة أولًا في الذاكرة. يعيد التابع بعدئذٍ عدد البايتات المكتوبة مضافًا إليه قيمة المعامل offset. إن كنت تريد كتابة البتات الأقل أهمية أولًا (big endian)، فاستعمل writeUInt32BE()‎؛ وإن كنت تريد كتابة البتات الأكثر أهمية أولًا (little endian)، فاستعمل writeUInt32LE()‎.

يجب أن يكون المعامل value عددًا صحيحًا عديم الإشارة بحجم 32 بت، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.

const buf = Buffer.allocUnsafe(4);

buf.writeUInt32BE(0xfeedface, 0);

console.log(buf);
// <Buffer fe ed fa ce> :سيُطبع

buf.writeUInt32LE(0xfeedface, 0);

console.log(buf);
// <Buffer ce fa ed fe> :سيُطبع

buf.writeUIntBE(value, offset, byteLength)‎ و buf.writeUIntLE(value, offset, byteLength)

الإصدار التغييرات
v10.0.0 حذف المعامل noAssert، ولم يعد يُحوَّل المعامل offset إلى النوع uint32 ضمنيًّا بعد الآن.
v0.5.5 أضيف هذا التابع.
  • value: ‏<number> عددٌ صحيحٌ عديم الإشارة (unsigned integer) يراد كتابته في كائن buf معيَّن.
  • offset: ‏<number> عدد البايتات المراد تخطيها قبل البدء بعمليَّة القراءة. ويجب أن تقع القيمة المعطاة بين المجال ‎0 <= offset <= buf.length - byteLength.
  • byteLength: ‏<integer> عدد البايتات المراد كتابتها. يجب أن تقع قيمة هذا المعامل في المجال ‎0 < byteLength <= 6.

يكتب هذا التابع عددًا محددًا من بايتات المعامل value المعطى في buf بدءًا من البايت offset ثمَّ يعيد عدد البايتات المكتوبة مضافًا إليه قيمة المعامل offset.

يدعم هذا التابع الأعداد الصحيحة عديمة الإشارة بدقة تصل إلى 48 بت. يجب أن يكون المعامل value عددًا صحيحًا عديم الإشارة، ولن يُعرَف سلوك التابع إن كانت قيمة المعامل غير ذلك.

const buf = Buffer.allocUnsafe(6);

buf.writeUIntBE(0x1234567890ab, 0, 6);

console.log(buf);
// <Buffer 12 34 56 78 90 ab> :سيُطبع

buf.writeUIntLE(0x1234567890ab, 0, 6);

console.log(buf);
// <Buffer ab 90 78 56 34 12> :سيُطبع

الخاصية buffer.INSPECT_MAX_BYTES

أضيفت في الإصدار v0.5.4.

تعيد هذه الخاصِّيَّة عدد البايتات الأعظمي التي سيُعاد عند استدعاء buf.inspect()‎. القيمة الافتراضيَّة هي: 50. يمكن أن يُستبدَل هذا العدد من طرف وحدات المستخدم. ارجع إلى util.inspect()‎ لتفاصيل أوسع حول سلوك التابع buf.inspect()‎.

انتبه إلى أنَّ هذه الخاصِّيًّة هي خاصِّيَّةٌ في الوحدة Buffer تُعاد عبر require('buffer')‎ وليست في Buffer العام أو نسخة Buffer.

الخاصية buffer.kMaxLength

أضيفت في الإصدار v3.0.0.

تعيد هذه الخاصِّيًّة عددًا يمثل أكبر حجم مسموح لنسخة Buffer واحدة، وهي اسم بديل للخاصِّيَّة buffer.constants.MAX_LENGTH.

انتبه إلى أنَّ هذه الخاصِّيًّة هي خاصِّيَّةٌ في الوحدة Buffer تُعاد عبر require('buffer')‎ وليست في Buffer العام أو نسخة Buffer.

التابع buffer.transcode(source, fromEnc, toEnc)

سجل التغييرات
الإصدار التغيير
v8.0.0 يمكن أن يكون المعامل source الآن نسخةً من النوع Uint8Array.
v7.1.0 أضيف هذا التابع.
  • source: ‏<Buffer> | <Uint8Array> نسخةٌ من Buffer أو Uint8Array.
  • fromEnc: ‏<string> الترميز الحالي.
  • toEnc: ‏<string> الترميز المراد التحويل إليه.

تغير هذه الدالة ترميز نسخة Buffer أو Uint8Array المعطية من ترميز إلى آخر ثمَّ تضع الناتج في نسخة Buffer جديدة وتعيدها.

سيُرمى خطأ إن كان الترميز fromEnc أو الترميز toEnc غير مدعوم أو غير صحيح أو إن لم يكن مسموحًا بالتحويل من الترميز fromEnc إلى الترميز toEnc.

ستَستعمل عمليَّة التحويل التي تجريها هذه الدالة محارف بديلة إن لم يكن بالإمكان تمثيل أحد البايتات المعطية على نحو ملائم في الترميز المراد التحويل إليه. إليك هذه الشيفرة مثلًا التي تشرح ذلك:

const buffer = require('buffer');

const newBuf = buffer.transcode(Buffer.from('€'), 'utf8', 'ascii');
console.log(newBuf.toString('ascii'));
// '?' :سيُطبع

لمَّا كان المحرف € غير قابل للتمثيل في الترميز US-ASCII، فاستُبدِل به المحرف ? في النسخة Buffer المحولة إلى ذلك الترميز.

انتبه إلى أنَّ هذه الخاصِّيَّة هي خاصِّيَّةٌ في الوحدة Buffer تُعاد عبر require('buffer')‎ وليست في Buffer العام أو نسخة Buffer.

الصنف SlowBuffer

أهمل في الإصدار v6.0.0.

الاستقرار: 0-مهمل: استعمل Buffer.allocUnsafeSlow()‎ عوضًا عنه.

يستعمل هذا الصنف لإنشاء نسخة Buffer تقع خارج المُجمِّع (pool) المحجوز مسبقًا.

عند إنشاء نسخ جديدة من Buffer، تُقتَطَع بشكل افتراضي حجوزات الذاكرة التي تقل عن 4 كيلوبايت من نسخة Buffer واحدة محجوزة مسبقًا. هذا يساعد التطبيقات على تجنب زيادة مجمَّع المهملات (garbage allocation) عبر تقليل إنشاء نسخ Buffer جديدة وحجز أجزاء من الذاكرة بشكل فردي. يحسِّن ذلك الأداء واستخدام الذاكرة عبر تقليل الحاجة إلى تتبُّع وإزالة أقل قدر ممكن من الكائنات الموجودة والمتكرِّرة.

مع ذلك، في حال احتاج المطور إلى الاحتفاظ يجزءٍ صغيرٍ من الذاكرة يقع في المجمِّع (pool) المحجوز مسبقًا لفترة زمنية غير معلومة، فيُستحسَن إنشاء نسخة Buffer بحجز جزء آخر من الذاكر يقع خارج مجمِّع الذاكرة المحجوز مسبقًا (un-pooled) عبر استعمال SlowBuffer ثمَّ نسخ البيانات التي تريد الاحتفاظ بها إليها.

// الحاجة إلى الاحتفاظ ببعض أجزاء الذاكرة
const store = [];

socket.on('readable', () => {
  const sb = SlowBuffer(10);

  // حجز جزء من الذاكرة خاص بالبيانات المراد الاحتفاظ بها
  const sb = Buffer.allocUnsafeSlow(10);

  // نسخ البيانات إلى موقع جديد
  data.copy(sb, 0, 0, 10);

  store.push(sb);
});

يجب عدم اللجوء إلى استعمال الصنف SlowBuffer إلا في نهاية المطاف بعد أن يلاحظ المطور نفسه أنه احتفظ بأجزاء من الذاكرة لا حاجة له فيها في تطبيقه.

new SlowBuffer(size)‎

أهملت في الإصدار v6.0.0.

الاستقرار: 0-مهمل: استعمل التابع Buffer.allocUnsafeSlow()‎ عوضًا عن هذه الدالة.

  • size: ‏<integer> حجم الذاكرة المراد حجزه للنسخة Buffer المنشأة.

تنشئ هذه الدالة نسخة Buffer جديدة وتحجز لها من الذاكرة الحجم size المعطى. إن كانت قيمة المعامل size المعطاة أكبر من buffer.constants.MAX_LENGTH أو أصغر من الصفر، فسيُرمى الخطأ ERR_INVALID_OPT_VALUE. الجدير بالذكر أنَّه تنشأ النسخة Buffer إن أعطيت القيمة 0 للمعامل size.

انتبه إلى أنَّ هذه الدالة لا تهيئ الذاكرة التي تحجزها عند استعمالها لإنشاء نسخٍ من Buffer. نتيجةً لذلك، لا يُعرَف المحتوى الأولي للنسخة Buffer المنشأة آنذاك وقد يحوي بعض البيانات الحسَّاسة التي كتبت على تلك الذاكرة مسبقًا. إن أردت تهيئة جزء الذاكرة المحجوز ووضع قيمة أولية معروفة فيه، فاستعمل التابع buf.fill()‎.

const { SlowBuffer } = require('buffer');

const buf = new SlowBuffer(5);

console.log(buf);
// <Buffer 78 e0 82 02 01> :سيُطبع شيء شبيه بهذا

buf.fill(0);

console.log(buf);
// <Buffer 00 00 00 00 00> :سيُطبع

ثوابت Buffer

أضيفت في الإصدار v8.2.0.

انتبه إلى أنَّ buffer.constants خاصِّيَّةٌ في الوحدة buffer تُعاد عبر require('buffer')‎ وليست في Buffer العام أو نسخة Buffer.

الخاصية buffer.constants.MAX_LENGTH

أضيفت في الإصدار v8.2.0.

تعيد هذه الخاصِّيَّة عددًا يمثل أكبر حجم مسموح لنسخة Buffer واحدة. فتكون قيمة هذا الثابت في الأنظمة ذات المعمارية 32 بت هي ‎(2^30)-1 (تقريبًا 1 غيغابايت)، وفي الأنظمة ذات المعمارية 64 بت هي ‎(2^31)-1 (تقريبًا 2 غيغابايت).

هنالك اسم بديل لهذه الخاصِّيَّة هو buffer.kMaxLength.

الخاصية buffer.constants.MAX_STRING_LENGTH

أضيفت في الإصدار v8.2.0.

تعيد هذه الخاصِّيَّة عددًا يمثل أكبر حجم مسموح لنسخة string واحدة، إذ يُحسَب هذا الحجم في واحدات الترميز UTF-16.

قد تعتمد هذه القيمة على محرك JavaScript المُستعمَل.

مصادر