JavaScript นั้นดีในการจัดการสตริง แต่เนื่องจากมันถูกออกแบบมาเพื่อจัดการเอกสาร HTML แต่เดิมจึงไม่ค่อยดีนักในการจัดการข้อมูลไบนารี JavaScript ไม่มีประเภทไบต์ไม่มีประเภทที่มีโครงสร้างและแม้แต่ไม่มีอาร์เรย์ไบต์ตัวเลขและสตริงเท่านั้น (ข้อความต้นฉบับ: JavaScript ไม่มีประเภทไบต์ - มันมีตัวเลข - หรือประเภทที่มีโครงสร้างหรือ http://skylitecellars.com/ แม้กระทั่งอาร์เรย์ไบต์: มันมีสตริง)
เนื่องจากโหนดขึ้นอยู่กับ JavaScript จึงสามารถจัดการโปรโตคอลข้อความเช่น HTTP ได้ตามธรรมชาติ แต่คุณสามารถใช้มันเพื่อโต้ตอบกับฐานข้อมูลกระบวนการประมวลผลภาพหรือการอัปโหลดไฟล์ ฯลฯ มันเป็นไปได้ว่ามันยากที่จะทำสิ่งเหล่านี้ด้วยสตริง ก่อนหน้านี้โหนดจัดการข้อมูลไบนารีโดยการเข้ารหัสไบต์เป็นอักขระข้อความ แต่วิธีนี้ในภายหลังได้พิสูจน์แล้วว่าไม่สามารถทำได้ทรัพยากรที่สูญเปล่าช้ายืดหยุ่นและยากต่อการบำรุงรักษา
Node มีบัฟเฟอร์การใช้งานบัฟเฟอร์แบบไบนารี คลาสหลอกนี้ให้ชุด APIs สำหรับการประมวลผลข้อมูลไบนารีซึ่งทำให้งานง่ายขึ้นซึ่งต้องใช้ข้อมูลไบนารีในการประมวลผล ความยาวของบัฟเฟอร์ถูกกำหนดโดยความยาวของข้อมูลไบต์และคุณสามารถตั้งค่าและรับข้อมูลไบต์ในบัฟเฟอร์
หมายเหตุ: คลาสบัฟเฟอร์มีสถานที่พิเศษ หน่วยความจำที่ถูกครอบครองโดยข้อมูลไบต์ในบัฟเฟอร์ไม่ได้ถูกจัดสรรใน Javascrp
มันเป็นฮีปหน่วยความจำ VM นั่นคือวัตถุเหล่านี้จะไม่ถูกประมวลผลโดยอัลกอริทึมการรวบรวมขยะของ JavaScript และจะถูกแทนที่ด้วยที่อยู่หน่วยความจำถาวรที่จะไม่ถูกแก้ไขซึ่งยังหลีกเลี่ยงขยะ CPU ที่เกิดจากการคัดลอกเนื้อหาบัฟเฟอร์
สร้างบัฟเฟอร์
คุณสามารถสร้างบัฟเฟอร์ด้วยสตริง UTF-8 เช่นนี้:
การคัดลอกรหัสมีดังนี้:
var buf = บัฟเฟอร์ใหม่ ('Hello World!');
คุณยังสามารถสร้างบัฟเฟอร์ด้วยการเข้ารหัสที่ระบุ:
การคัดลอกรหัสมีดังนี้:
var buf = บัฟเฟอร์ใหม่ ('8b76fde713ce', 'base64');
การเข้ารหัสอักขระที่ยอมรับได้และการระบุตัวตนมีดังนี้:
1.ASCII-ASCI ใช้เฉพาะกับชุดอักขระ ASCII
2.UTF8-UTF-8 การเข้ารหัสตัวแปรทั่วทั้งตัวแปรนี้เหมาะสำหรับอักขระใด ๆ ในชุดอักขระ Unicode มันได้กลายเป็นการเข้ารหัสที่ต้องการในโลกเว็บและยังเป็นประเภทการเข้ารหัสเริ่มต้นของโหนด
3.BASE64 - BASE64 การเข้ารหัสนี้ใช้อักขระ ASCII ที่พิมพ์ได้ 64 ตัวเพื่อแสดงข้อมูลไบนารี BASE64 มักจะใช้ในการฝังข้อมูลไบนารีที่สามารถแปลงเป็นสตริงในเอกสารอักขระและสามารถแปลงกลับเป็นรูปแบบไบนารีดั้งเดิมที่ไม่สมบูรณ์และไม่สูญเสียเมื่อจำเป็น
หากไม่มีข้อมูลที่จะเริ่มต้นบัฟเฟอร์คุณสามารถสร้างบัฟเฟอร์เปล่าที่มีขนาดความจุที่ระบุ:
การคัดลอกรหัสมีดังนี้:
var buf = บัฟเฟอร์ใหม่ (1024); // สร้างบัฟเฟอร์ 1024-byte
รับและตั้งค่าข้อมูลบัฟเฟอร์
หลังจากสร้างหรือรับวัตถุบัฟเฟอร์คุณอาจต้องการดูหรือแก้ไขเนื้อหา คุณสามารถเข้าถึงไบต์บางอย่างของบัฟเฟอร์ผ่านตัวดำเนินการ []:
การคัดลอกรหัสมีดังนี้:
var buf = บัฟเฟอร์ใหม่ ('เนื้อหาบัฟเฟอร์ของฉัน');
// เข้าถึงไบต์ที่ 10 ในบัฟเฟอร์
console.log (buf [10]); // -> 99
หมายเหตุ: เมื่อคุณสร้างบัฟเฟอร์ที่เริ่มต้น (โดยใช้ขนาดความจุบัฟเฟอร์) โปรดทราบว่าข้อมูลบัฟเฟอร์ไม่ได้เริ่มต้นเป็น 0 แต่เป็นข้อมูลแบบสุ่ม
การคัดลอกรหัสมีดังนี้:
var buf = บัฟเฟอร์ใหม่ (1024);
console.log (buf [100]); // -> 5 (ค่าสุ่มบางส่วน)
คุณสามารถแก้ไขข้อมูลได้ทุกที่ในบัฟเฟอร์เช่นนี้:
การคัดลอกรหัสมีดังนี้:
buf [99] = 125; // ตั้งค่าของไบต์ที่ 100 เป็น 125
หมายเหตุ: ในบางกรณีการดำเนินการบัฟเฟอร์บางอย่างไม่ได้สร้างข้อผิดพลาดเช่น:
1. ค่าสูงสุดของไบต์ในบัฟเฟอร์คือ 255. หากไบต์ได้รับการกำหนดตัวเลขมากกว่า 256 มันจะถูกปรับด้วย 256 จากนั้นกำหนดผลลัพธ์ให้กับไบต์นี้
2. หากไบต์บัฟเฟอร์ถูกกำหนดให้กับ 256 ค่าที่แท้จริงของมันจะเป็น 0 (หมายเหตุของนักแปล: มันซ้ำแล้วซ้ำอีกกับอันแรก, 256%256 = 0)
3. หากคุณใช้หมายเลขจุดลอยตัวเพื่อกำหนดค่าให้กับไบต์ในบัฟเฟอร์เช่น 100.7 ค่าที่แท้จริงจะเป็นส่วนจำนวนเต็มของหมายเลขจุดลอยตัว - 100
4. หากคุณพยายามกำหนดค่าให้กับตำแหน่งที่เกินความจุบัฟเฟอร์การดำเนินการที่ได้รับมอบหมายจะล้มเหลวและบัฟเฟอร์จะไม่ถูกแก้ไข
คุณสามารถใช้แอตทริบิวต์ความยาวเพื่อรับความยาวบัฟเฟอร์:
การคัดลอกรหัสมีดังนี้:
var buf = บัฟเฟอร์ใหม่ (100);
console.log (buf.length); // -> 100
นอกจากนี้คุณยังสามารถวนซ้ำเนื้อหาบัฟเฟอร์โดยใช้ความยาวบัฟเฟอร์ในการอ่านหรือตั้งค่าแต่ละไบต์:
การคัดลอกรหัสมีดังนี้:
var buf = บัฟเฟอร์ใหม่ (100);
สำหรับ (var i = 0; i <buf.length; i ++) {
buf [i] = i;
-
รหัสด้านบนสร้างบัฟเฟอร์ใหม่ที่มี 100 ไบต์และตั้งค่าแต่ละไบต์ในบัฟเฟอร์ตั้งแต่ 0 ถึง 99
หั่นข้อมูลบัฟเฟอร์
เมื่อสร้างหรือรับบัฟเฟอร์คุณอาจต้องแยกส่วนหนึ่งของข้อมูลบัฟเฟอร์ คุณสามารถแยกบัฟเฟอร์ที่มีอยู่ได้โดยระบุตำแหน่งเริ่มต้นเพื่อสร้างบัฟเฟอร์ขนาดเล็กอื่น:
การคัดลอกรหัสมีดังนี้:
var buffer = buffer ใหม่ ("นี่คือเนื้อหาของบัฟเฟอร์ของฉัน");
var smallerbuffer = buffer.slice (8, 19);
console.log (SmallerBuffer.toString ()); // -> "เนื้อหา"
โปรดทราบว่าเมื่อแยกบัฟเฟอร์จะไม่มีการจัดสรรหรือคัดลอกหน่วยความจำใหม่ บัฟเฟอร์ใหม่ใช้หน่วยความจำบัฟเฟอร์หลักซึ่งเป็นเพียงการอ้างอิงถึงข้อมูลบางส่วน (ระบุโดยตำแหน่งเริ่มต้น) ข้อความนี้มีความหมายหลายอย่าง
ก่อนอื่นหากโปรแกรมของคุณแก้ไขเนื้อหาของบัฟเฟอร์หลักการแก้ไขเหล่านี้จะส่งผลกระทบต่อบัฟเฟอร์เด็กที่เกี่ยวข้องเนื่องจากบัฟเฟอร์หลักและบัฟเฟอร์เด็กเป็นวัตถุ JavaScript ที่แตกต่างกันดังนั้นจึงเป็นเรื่องง่ายที่จะเพิกเฉยต่อปัญหานี้และนำไปสู่ข้อบกพร่องที่อาจเกิดขึ้น
ประการที่สองเมื่อคุณสร้างบัฟเฟอร์เด็กขนาดเล็กจากบัฟเฟอร์หลักด้วยวิธีนี้วัตถุบัฟเฟอร์หลักจะยังคงถูกเก็บไว้หลังจากการดำเนินการเสร็จสิ้นและจะไม่ถูกเก็บรวบรวมขยะ หากคุณไม่ระวังมันจะทำให้เกิดการรั่วไหลของหน่วยความจำได้อย่างง่ายดาย
หมายเหตุ: หากคุณกังวลเกี่ยวกับการรั่วไหลของหน่วยความจำคุณสามารถใช้วิธีการคัดลอกแทนการทำงานชิ้น ต่อไปนี้จะแนะนำสำเนา
คัดลอกข้อมูลบัฟเฟอร์
คุณสามารถใช้สำเนาเพื่อคัดลอกส่วนหนึ่งของบัฟเฟอร์ไปยังบัฟเฟอร์อื่นเช่นนี้:
การคัดลอกรหัสมีดังนี้:
var buffer1 = ใหม่บัฟเฟอร์ ("นี่คือเนื้อหาของบัฟเฟอร์ของฉัน");
var buffer2 = บัฟเฟอร์ใหม่ (11);
var targetStart = 0;
var sourcestart = 8;
var sourceend = 19;
buffer1.copy (buffer2, targetStart, sourcestart, sourceend);
console.log (buffer2.toString ()); // -> "เนื้อหา"
ในรหัสด้านบนคัดลอกไบต์ 9 ถึง 20 ของบัฟเฟอร์ต้นทางไปยังตำแหน่งเริ่มต้นของบัฟเฟอร์เป้าหมาย
ถอดรหัสข้อมูลบัฟเฟอร์
ข้อมูลบัฟเฟอร์สามารถแปลงเป็นสตริง UTF-8 เช่นนี้:
การคัดลอกรหัสมีดังนี้:
var str = buf.toString ();
ข้อมูลบัฟเฟอร์ยังสามารถถอดรหัสลงในข้อมูลประเภทการเข้ารหัสใด ๆ โดยระบุประเภทการเข้ารหัส ตัวอย่างเช่นหากคุณต้องการถอดรหัสบัฟเฟอร์เป็นสตริง Base64 คุณสามารถทำได้:
การคัดลอกรหัสมีดังนี้:
var b64str = buf.toString ("base64");
การใช้ฟังก์ชั่น ToString คุณยังสามารถแปลงรหัสสตริง UTF-8 ลงในสตริง Base64:
การคัดลอกรหัสมีดังนี้:
var utf8string = 'my string';
var buf = บัฟเฟอร์ใหม่ (utf8string);
var base64string = buf.toString ('base64')
สรุป
บางครั้งคุณต้องจัดการกับข้อมูลไบนารี แต่ JavaScript ดั้งเดิมไม่มีวิธีที่ชัดเจนในการทำเช่นนี้ดังนั้น Node จึงมีคลาสบัฟเฟอร์ที่ห่อหุ้มการดำเนินการบางอย่างสำหรับบล็อกหน่วยความจำอย่างต่อเนื่อง คุณสามารถแยกหรือคัดลอกข้อมูลหน่วยความจำระหว่างบัฟเฟอร์สองตัว
คุณยังสามารถแปลงบัฟเฟอร์เป็นสตริงที่เข้ารหัสบางชนิดหรือในทางกลับกันแปลงสตริงเป็นบัฟเฟอร์เพื่อเข้าถึงหรือประมวลผลแต่ละบิต