Buffer தொகுதி என்றால் என்ன?
Node.js இல் Buffer தொகுதி பைனரி தரவைக் கையாள பயன்படுகிறது.
Buffers முழு எண்களின் வரிசைகளைப் போன்றவை, ஆனால் நிலையான நீளம் கொண்டவை மற்றும் V8 JavaScript இயந்திரத்திற்கு வெளியே உள்ள மூல நினைவக ஒதுக்கீடுகளுக்கு ஒத்திருக்கும்.
Node.js Buffer வகுப்பை ஒரு உலகளாவிய பொருளாக வழங்குகிறது, எனவே நீங்கள் அதை வெளிப்படையாக தேவைப்படுத்தவோ இறக்குமதி செய்யவோ தேவையில்லை.
குறிப்பு:
Node.js v6.0.0 முதல், Buffer கட்டமைப்பான் புதிய Buffer முறைகளுக்கு ஆதரவாக கைவிடப்பட்டது.
கட்டமைப்பாளரைப் பயன்படுத்துவது துவக்கப்படாத நினைவகத்தின் காரணமாக பாதுகாப்பு பாதிப்புகளுக்கு வழிவகுக்கும்.
Buffers உடன் தொடங்குதல்
Node.js இல் Buffers பைனரி தரவை நேரடியாக கையாள பயன்படுகின்றன.
அவை முழு எண்களின் வரிசைகளைப் போன்றவை, ஆனால் அளவில் நிலையானவை மற்றும் V8 குவிப்பிற்கு வெளியே உள்ள மூல நினைவக ஒதுக்கீடுகளைக் குறிக்கின்றன.
அடிப்படை Buffer எடுத்துக்காட்டு
// Create a buffer from a string
const buf = Buffer.from('Hello, Node.js!');
// Buffers can be converted to strings
console.log(buf.toString()); // 'Hello, Node.js!'
// Access individual bytes
console.log(buf[0]); // 72 (ASCII for 'H')
// Buffers have a fixed length
console.log(buf.length); // 15
Buffers உருவாக்குதல்
Node.js இல் buffers உருவாக்க பல வழிகள் உள்ளன, ஒவ்வொன்றும் வெவ்வேறு செயல்திறன் மற்றும் பாதுகாப்பு பண்புகளைக் கொண்டுள்ளன:
1. Buffer.alloc()
குறிப்பிட்ட அளவின் புதிய Buffer ஐ உருவாக்குகிறது, பூஜ்ஜியங்களுடன் துவக்கப்படுகிறது.
பழைய தரவு எதுவும் இல்லை என்பதை உறுதி செய்வதால், இது புதிய buffer உருவாக்குவதற்கான மிகவும் பாதுகாப்பான வழியாகும்.
// Create a buffer of 10 bytes filled with zeros
const buffer1 = Buffer.alloc(10);
console.log(buffer1);
2. Buffer.allocUnsafe()
குறிப்பிட்ட அளவின் புதிய Buffer ஐ உருவாக்குகிறது, ஆனால் நினைவகத்தை துவக்காது.
இது Buffer.alloc() ஐ விட வேகமானது, ஆனால் பழைய அல்லது உணர்திறன் தரவைக் கொண்டிருக்கலாம்.
பாதுகாப்பு ஒரு கவலையாக இருந்தால், பயன்படுத்துவதற்கு முன்பு எப்போதும் buffer ஐ நிரப்பவும்.
// Create an uninitialized buffer of 10 bytes
const buffer2 = Buffer.allocUnsafe(10);
console.log(buffer2);
// Fill the buffer with zeros for security
buffer2.fill(0);
console.log(buffer2);
எச்சரிக்கை:
Buffer.allocUnsafe() என்பது Buffer.alloc() ஐ விட வேகமானது, ஆனால் உணர்திறன் தரவை வெளிப்படுத்தும்.
நீங்கள் பாதுகாப்பு தாக்கங்களைப் புரிந்துகொண்டு, உடனடியாக முழு buffer ஐ நிரப்ப திட்டமிட்டால் மட்டுமே அதைப் பயன்படுத்தவும்.
3. Buffer.from()
சரங்கள், வரிசைகள் அல்லது ArrayBuffer போன்ற பல்வேறு மூலங்களிலிருந்து புதிய Buffer ஐ உருவாக்குகிறது. இது இருக்கும் தரவிலிருந்து buffers உருவாக்குவதற்கான மிகவும் நெகிழ்வான வழியாகும்.
// Create a buffer from a string
const buffer3 = Buffer.from('Hello, World!');
console.log(buffer3);
console.log(buffer3.toString());
// Create a buffer from an array of integers
const buffer4 = Buffer.from([65, 66, 67, 68, 69]);
console.log(buffer4);
console.log(buffer4.toString());
// Create a buffer from another buffer
const buffer5 = Buffer.from(buffer4);
console.log(buffer5);
Buffers பயன்படுத்துதல்
Buffers க்கு எழுதுதல்
பல்வேறு முறைகளைப் பயன்படுத்தி ஒரு buffer க்கு தரவை எழுதலாம்:
// Create an empty buffer
const buffer = Buffer.alloc(10);
// Write a string to the buffer
buffer.write('Hello');
console.log(buffer);
console.log(buffer.toString());
// Write bytes at specific positions
buffer[5] = 44; // ASCII for ','
buffer[6] = 32; // ASCII for space
buffer.write('Node', 7);
console.log(buffer.toString());
Buffers இலிருந்து படித்தல்
பல்வேறு முறைகளைப் பயன்படுத்தி ஒரு buffer இலிருந்து தரவைப் படிக்கலாம்:
// Create a buffer from a string
const buffer = Buffer.from('Hello, Node.js!');
// Read the entire buffer as a string
console.log(buffer.toString());
// Read a portion of the buffer (start at position 7, end before position 11)
console.log(buffer.toString('utf8', 7, 11));
// Read a single byte
console.log(buffer[0]);
// Convert the ASCII code to a character
console.log(String.fromCharCode(buffer[0]));
Buffers வழியாக மறு செய்கை
Buffers வரிசைகளைப் போலவே மீண்டும் செய்யப்படலாம்:
// Create a buffer from a string
const buffer = Buffer.from('Hello');
// Iterate using for...of loop
for (const byte of buffer) {
console.log(byte);
}
// Iterate using forEach
buffer.forEach((byte, index) => {
console.log(`Byte at position ${index}: ${byte}`);
});
Buffer முறைகள்
Buffer.compare()
இரண்டு buffers ஐ ஒப்பிட்டு, முதல் ஒன்று இரண்டாவதை விட முன்னால் வருகிறதா, பின்னால் வருகிறதா அல்லது அதே போன்றதா என்பதைக் குறிக்கும் எண்ணை வழங்குகிறது:
const buffer1 = Buffer.from('ABC');
const buffer2 = Buffer.from('BCD');
const buffer3 = Buffer.from('ABC');
console.log(Buffer.compare(buffer1, buffer2));
console.log(Buffer.compare(buffer2, buffer1));
console.log(Buffer.compare(buffer1, buffer3));
buffer.copy()
ஒரு buffer இலிருந்து மற்றொன்றுக்கு தரவை நகலெடுக்கிறது:
// Create source and target buffers
const source = Buffer.from('Hello, World!');
const target = Buffer.alloc(source.length);
// Copy from source to target
source.copy(target);
console.log(target.toString());
// Create a target buffer for partial copy
const partialTarget = Buffer.alloc(5);
// Copy only part of the source (starting at index 7)
source.copy(partialTarget, 0, 7);
console.log(partialTarget.toString());
buffer.slice()
அசல் போன்ற அதே நினைவகத்தைக் குறிக்கும் புதிய buffer ஐ உருவாக்குகிறது, ஆனால் ஆஃப்செட் மற்றும் கொடுக்கப்பட்ட முடிவிற்கு வெட்டப்பட்டது:
const buffer = Buffer.from('Hello, World!');
// Create a slice from position 7 to the end
const slice = buffer.slice(7);
console.log(slice.toString());
// Create a slice from position 0 to 5
const slice2 = buffer.slice(0, 5);
console.log(slice2.toString());
// Important: slices share memory with original buffer
slice[0] = 119; // ASCII for 'w' (lowercase)
console.log(slice.toString());
console.log(buffer.toString());
குறிப்பு:
buffer.slice() அதே நினைவகத்தின் காட்சியை உருவாக்குவதால், அசல் buffer அல்லது slice ஐ மாற்றியமைப்பது மற்றொன்றை பாதிக்கும்.
buffer.toString()
குறிப்பிட்ட குறியாக்கத்தைப் பயன்படுத்தி ஒரு buffer ஐ சரமாக குறிவிலக்கிக்கிறது:
const buffer = Buffer.from('Hello, World!');
// Default encoding is UTF-8
console.log(buffer.toString());
// Specify encoding
console.log(buffer.toString('utf8'));
// Decode only a portion of the buffer
console.log(buffer.toString('utf8', 0, 5));
// Using different encodings
const hexBuffer = Buffer.from('48656c6c6f', 'hex');
console.log(hexBuffer.toString());
const base64Buffer = Buffer.from('SGVsbG8=', 'base64');
console.log(base64Buffer.toString());
buffer.equals()
உள்ளடக்கம் சமத்துவத்திற்காக இரண்டு buffers ஐ ஒப்பிடுகிறது:
const buffer1 = Buffer.from('Hello');
const buffer2 = Buffer.from('Hello');
const buffer3 = Buffer.from('World');
console.log(buffer1.equals(buffer2));
console.log(buffer1.equals(buffer3));
console.log(buffer1 === buffer2);
குறியாக்கங்களுடன் பணிபுரிதல்
Buffers சரங்கள் மற்றும் பைனரி தரவிற்கு இடையே மாற்றும் போது பல்வேறு குறியாக்கங்களுடன் வேலை செய்கின்றன:
// Create a string
const str = 'Hello, World!';
// Convert to different encodings
const utf8Buffer = Buffer.from(str, 'utf8');
console.log('UTF-8:', utf8Buffer);
const base64Str = utf8Buffer.toString('base64');
console.log('Base64 string:', base64Str);
const hexStr = utf8Buffer.toString('hex');
console.log('Hex string:', hexStr);
// Convert back to original
const fromBase64 = Buffer.from(base64Str, 'base64').toString('utf8');
console.log('From Base64:', fromBase64);
const fromHex = Buffer.from(hexStr, 'hex').toString('utf8');
console.log('From Hex:', fromHex);
Node.js இல் ஆதரிக்கப்படும் குறியாக்கங்கள்:
| குறியாக்கம் | விளக்கம் |
|---|---|
| utf8 | மல்டி-பைட் குறியாக்கப்பட்ட யூனிகோட் எழுத்துகள் (இயல்புநிலை) |
| ascii | ASCII எழுத்துகள் மட்டுமே (7-பிட்) |
| latin1 | லேட்டின்-1 குறியாக்கம் (ISO 8859-1) |
| base64 | Base64 குறியாக்கம் |
| hex | ஹெக்ஸாடெசிமல் குறியாக்கம் |
| binary | பைனரி குறியாக்கம் (கைவிடப்பட்டது) |
| ucs2/utf16le | 2 அல்லது 4 பைட்டுகள், லிட்டில்-எண்டியன் குறியாக்கப்பட்ட யூனிகோட் எழுத்துகள் |
மேம்பட்ட Buffer செயல்பாடுகள்
Buffers இணைத்தல்
Buffer.concat() ஐப் பயன்படுத்தி பல buffers ஐ ஒன்றாக இணைக்கலாம்:
const buf1 = Buffer.from('Hello, ');
const buf2 = Buffer.from('Node.js!');
// Concatenate buffers
const combined = Buffer.concat([buf1, buf2]);
console.log(combined.toString()); // 'Hello, Node.js!'
// With a maximum length parameter
const partial = Buffer.concat([buf1, buf2], 5);
console.log(partial.toString()); // 'Hello'
Buffers இல் தேடுதல்
Buffers மதிப்புகள் அல்லது வரிசைகளைத் தேடுவதற்கான முறைகளை வழங்குகின்றன:
const buf = Buffer.from('Hello, Node.js is awesome!');
// Find the first occurrence of a value
console.log(buf.indexOf('Node')); // 7
// Check if buffer contains a value
console.log(buf.includes('awesome')); // true
// Find the last occurrence of a value
console.log(buf.lastIndexOf('e')); // 24
Buffer மற்றும் Streams
Buffers திறந்த தரவு செயலாக்கத்திற்காக streams உடன் பொதுவாகப் பயன்படுத்தப்படுகின்றன:
const fs = require('fs');
const { Transform } = require('stream');
// Create a transform stream that processes data in chunks
const transformStream = new Transform({
transform(chunk, encoding, callback) {
// Process each chunk (which is a Buffer)
const processed = chunk.toString().toUpperCase();
this.push(Buffer.from(processed));
callback();
}
});
// Create a read stream from a file
const readStream = fs.createReadStream('input.txt');
// Create a write stream to a file
const writeStream = fs.createWriteStream('output.txt');
// Process the file in chunks
readStream.pipe(transformStream).pipe(writeStream);
Buffer மற்றும் கோப்பு முறைமை
Buffers கோப்பு முறைமை செயல்பாடுகளுக்கு பொதுவாகப் பயன்படுத்தப்படுகின்றன:
const fs = require('fs');
// Write buffer to file
const writeBuffer = Buffer.from('Hello, Node.js!');
fs.writeFile('buffer.txt', writeBuffer, (err) => {
if (err) throw err;
console.log('File written successfully');
// Read file into buffer
fs.readFile('buffer.txt', (err, data) => {
if (err) throw err;
// 'data' is a buffer
console.log('Read buffer:', data);
console.log('Buffer content:', data.toString());
// Read only part of the file into a buffer
const smallBuffer = Buffer.alloc(5);
fs.open('buffer.txt', 'r', (err, fd) => {
if (err) throw err;
// Read 5 bytes starting at position 7
fs.read(fd, smallBuffer, 0, 5, 7, (err, bytesRead, buffer) => {
if (err) throw err;
console.log('Partial read:', buffer.toString());
// Output: Node.
fs.close(fd, (err) => {
if (err) throw err;
});
});
});
});
});
Buffer செயல்திறன் பரிசீலனைகள்
Buffer பூல் செயலாக்கம்
// Simple buffer pool implementation
class BufferPool {
constructor(bufferSize = 1024, poolSize = 10) {
this.bufferSize = bufferSize;
this.pool = Array(poolSize).fill().map(() => Buffer.alloc(bufferSize));
this.used = Array(poolSize).fill(false);
}
// Get a buffer from the pool
get() {
const index = this.used.indexOf(false);
if (index === -1) {
// Pool is full, create a new buffer
console.log('Pool full, allocating new buffer');
return Buffer.alloc(this.bufferSize);
}
this.used[index] = true;
return this.pool[index];
}
// Return a buffer to the pool
release(buffer) {
const index = this.pool.indexOf(buffer);
if (index !== -1) {
// Zero the buffer for security
buffer.fill(0);
this.used[index] = false;
}
}
}
// Usage example
const pool = new BufferPool(10, 3); // 3 buffers of 10 bytes each
const buf1 = pool.get();
const buf2 = pool.get();
const buf3 = pool.get();
const buf4 = pool.get(); // This will allocate a new buffer
buf1.write('Hello');
console.log(buf1.toString()); // Hello
// Return buf1 to the pool
pool.release(buf1);
// Get another buffer (should reuse buf1)
const buf5 = pool.get();
console.log(buf5.toString()); // Should be empty (zeros)
Buffer பாதுகாப்பு பரிசீலனைகள்
பாதுகாப்பு எச்சரிக்கை:
Buffers நினைவகத்திலிருந்து உணர்திறன் தரவைக் கொண்டிருக்கலாம்.
Buffers கையாளும் போது எப்போதும் எச்சரிக்கையாக இருங்கள், குறிப்பாக அவை பயனர்களுக்கு வெளிப்படுத்தப்படலாம் அல்லது பதிவு செய்யப்படலாம்.
சிறந்த நடைமுறைகள்:
உணர்திறன் தரவைப் பாதுகாப்பாக கையாளுதல்:
// Example: Safely handling sensitive data
function processPassword(password) {
// Create a buffer to hold the password
const passwordBuffer = Buffer.from(password);
// Process the password (e.g., hashing)
const hashedPassword = hashPassword(passwordBuffer);
// Zero out the original password buffer for security
passwordBuffer.fill(0);
return hashedPassword;
}
// Simple hashing function for demonstration
function hashPassword(buffer) {
// In a real application, you would use a cryptographic hash function
// This is a simplified example
let hash = 0;
for (let i = 0; i < buffer.length; i++) {
hash = ((hash << 5) - hash) + buffer[i];
hash |= 0; // Convert to 32-bit integer
}
return hash.toString(16);
}
// Usage
const password = 'secret123';
const hashedPassword = processPassword(password);
console.log('Hashed password:', hashedPassword);
சுருக்கம்
Node.js Buffer வகுப்பு பைனரி தரவுடன் வேலை செய்வதற்கான ஒரு அத்தியாவசிய கருவியாகும். நினைவில் கொள்ள வேண்டிய முக்கிய புள்ளிகள்:
- Buffers JavaScript இல் பைனரி தரவைக் கையாள ஒரு வழியை வழங்குகின்றன
- buffers உருவாக்க Buffer.alloc(), Buffer.from(), மற்றும் Buffer.allocUnsafe() ஐப் பயன்படுத்தவும்
- Buffers write(), toString(), slice(), மற்றும் copy() போன்ற முறைகளுடன் கையாளப்படலாம்
- Buffers UTF-8, Base64, மற்றும் Hex உட்பட பல்வேறு குறியாக்கங்களை ஆதரிக்கின்றன
- Buffers கோப்பு I/O, நெட்வொர்க் செயல்பாடுகள் மற்றும் பைனரி தரவு செயலாக்கத்தில் பொதுவாகப் பயன்படுத்தப்படுகின்றன
- Buffers உடன் பணிபுரியும் போது செயல்திறன் மற்றும் பாதுகாப்பு தாக்கங்களைக் கருதுங்கள்