✂️ Slicing & Combining Buffers
const buf = Buffer.from('hello world');
const slice = buf.subarray(0, 5);
console.log(slice.toString());
// 'hello'
const a = Buffer.from('foo');
const b = Buffer.from('bar');
const combined = Buffer.concat([a, b]);
console.log(combined.toString());
// 'foobar'.subarray(start, end)pulls out a portion of a buffer — the modern replacement for the older.slice()(still works, butsubarrayis the current recommended name).Buffer.concat([...])joins multiple buffers into one — useful when data arrives in chunks and needs to be reassembled.
<div class="infographic-slicecat">
<style>
.infographic-slicecat {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--accent2: #7ea6f2;
--accent2-soft:#eaf1fd;
--line: #ddd6c9;
--radius: 10px;
box-sizing: border-box;
max-width: 880px;
margin: 0 auto;
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
color: var(--ink);
background: transparent;
}
.infographic-slicecat[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #13171F;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--accent2: #3d5a8f;
--accent2-soft:#1b2536;
--line: #2c313d;
}
.infographic-slicecat * { box-sizing: border-box; }
.infographic-slicecat .sc-inner { padding: 0 clamp(1rem, 4vw, 1.5rem); }
.infographic-slicecat .sc-eyebrow {
font-size: 0.7rem; font-weight: 600; letter-spacing: 0.09em;
text-transform: uppercase; color: var(--accent); margin: 0 0 0.35rem;
}
.infographic-slicecat h2 {
font-family: 'Newsreader', Georgia, serif; font-weight: 600;
font-size: clamp(1.5rem, 4vw, 2rem); line-height: 1.15;
margin: 0 0 0.3rem; letter-spacing: -0.01em;
}
.infographic-slicecat .sc-sub { font-size: 0.9rem; color: var(--ink-soft); margin: 0 0 1.4rem; }
.infographic-slicecat h3 {
font-family: 'Newsreader', Georgia, serif; font-weight: 600; font-size: 1.08rem;
margin: 0 0 0.15rem;
}
.infographic-slicecat .sc-h3-sub { font-size: 0.78rem; color: var(--ink-soft); margin: 0 0 0.8rem; }
/* shared card */
.infographic-slicecat .sc-card {
border: 1px solid var(--line); border-radius: var(--radius); background: var(--paper-alt);
padding: 1.05rem 1.1rem 1.15rem;
}
.infographic-slicecat .sc-card + .sc-card-title { margin-top: 1.7rem; }
.infographic-slicecat .sc-input {
width: 100%; font-family: 'SFMono-Regular', Consolas, Menlo, monospace; font-size: 0.92rem;
padding: 0.5rem 0.7rem; border: 1px solid var(--line); border-radius: 8px;
background: var(--paper); color: var(--ink); margin-bottom: 0.85rem;
}
.infographic-slicecat .sc-input:focus { outline: 2px solid var(--accent); outline-offset: 1px; }
/* letter strip (slice) */
.infographic-slicecat .sc-strip { display: flex; flex-wrap: wrap; gap: 0.3rem; margin-bottom: 0.8rem; }
.infographic-slicecat .sc-letter {
width: 34px; height: 38px; border-radius: 7px; border: 1px solid var(--line);
background: var(--paper); display: flex; align-items: center; justify-content: center;
font-family: 'SFMono-Regular', Consolas, Menlo, monospace; font-weight: 600; font-size: 0.9rem;
color: var(--ink-soft); cursor: pointer; opacity: 0.45;
transition: opacity 0.15s ease, background 0.15s ease, border-color 0.15s ease, transform 0.15s ease;
}
.infographic-slicecat .sc-letter:hover { border-color: var(--accent); }
.infographic-slicecat .sc-letter.is-picked { background: var(--accent); border-color: var(--accent); color: #fff; opacity: 1; }
.infographic-slicecat .sc-letter.is-anchor { transform: translateY(-3px); }
.infographic-slicecat .sc-result-row {
display: flex; align-items: center; gap: 0.6rem; flex-wrap: wrap;
}
.infographic-slicecat .sc-code {
font-family: 'SFMono-Regular', Consolas, Menlo, monospace; font-size: 0.8rem;
color: var(--ink-soft); background: var(--paper); border: 1px solid var(--line);
border-radius: 7px; padding: 0.4rem 0.7rem;
}
.infographic-slicecat .sc-code b { color: var(--accent); font-weight: 700; }
.infographic-slicecat .sc-arrow { color: var(--ink-soft); }
.infographic-slicecat .sc-arrow svg { width: 15px; height: 15px; stroke: var(--ink-soft); }
.infographic-slicecat .sc-result {
font-family: 'SFMono-Regular', Consolas, Menlo, monospace; font-size: 0.9rem; font-weight: 700;
color: var(--accent); background: var(--accent-soft); border: 1px solid var(--accent);
border-radius: 7px; padding: 0.4rem 0.75rem;
}
.infographic-slicecat .sc-hint { font-size: 0.74rem; color: var(--ink-soft); margin-top: 0.7rem; opacity: 0.85; }
/* concat */
.infographic-slicecat .sc-concat-inputs { display: flex; gap: 0.7rem; margin-bottom: 0.9rem; flex-wrap: wrap; }
.infographic-slicecat .sc-concat-col { flex: 1; min-width: 130px; }
.infographic-slicecat .sc-concat-label {
font-size: 0.68rem; font-weight: 700; font-family: 'SFMono-Regular', Consolas, Menlo, monospace;
margin-bottom: 0.3rem; display: block;
}
.infographic-slicecat .sc-concat-label.is-a { color: var(--accent); }
.infographic-slicecat .sc-concat-label.is-b { color: var(--accent2); }
.infographic-slicecat .sc-concat-input {
width: 100%; font-family: 'SFMono-Regular', Consolas, Menlo, monospace; font-size: 0.88rem;
padding: 0.45rem 0.6rem; border-radius: 7px; background: var(--paper); color: var(--ink);
}
.infographic-slicecat .sc-concat-input.is-a { border: 2px solid var(--accent); }
.infographic-slicecat .sc-concat-input.is-b { border: 2px solid var(--accent2); }
.infographic-slicecat .sc-concat-input:focus { outline: none; }
.infographic-slicecat .sc-mini-strips { display: flex; align-items: center; gap: 0.5rem; margin-bottom: 1rem; flex-wrap: wrap; }
.infographic-slicecat .sc-mini-row { display: flex; gap: 0.28rem; flex-wrap: wrap; }
.infographic-slicecat .sc-mini {
width: 28px; height: 30px; border-radius: 6px; display: flex; align-items: center; justify-content: center;
font-family: 'SFMono-Regular', Consolas, Menlo, monospace; font-size: 0.72rem; font-weight: 700; color: #fff;
}
.infographic-slicecat .sc-mini.is-a { background: var(--accent); }
.infographic-slicecat .sc-mini.is-b { background: var(--accent2); color: var(--ink); }
.infographic-slicecat .sc-plus {
flex: none; width: 26px; height: 26px; border-radius: 50%; background: var(--paper);
border: 1px solid var(--line); display: flex; align-items: center; justify-content: center; color: var(--ink-soft);
}
.infographic-slicecat .sc-plus svg { width: 13px; height: 13px; stroke: var(--ink-soft); }
.infographic-slicecat .sc-combined-strip { display: flex; gap: 0.28rem; flex-wrap: wrap; margin-bottom: 0.7rem; min-height: 32px; }
.infographic-slicecat .sc-combined-cell {
width: 28px; height: 30px; border-radius: 6px; display: flex; align-items: center; justify-content: center;
font-family: 'SFMono-Regular', Consolas, Menlo, monospace; font-size: 0.72rem; font-weight: 700; color: #fff;
opacity: 0; transform: translateY(6px) scale(0.8);
transition: opacity 0.3s ease, transform 0.3s ease;
}
.infographic-slicecat .sc-combined-cell.is-in { opacity: 1; transform: translateY(0) scale(1); }
.infographic-slicecat .sc-combined-cell.is-a { background: var(--accent); }
.infographic-slicecat .sc-combined-cell.is-b { background: var(--accent2); color: var(--ink); }
</style>
<div class="sc-inner">
<h3>subarray()</h3>
<p class="sc-h3-sub">Tap a start letter, then an end letter.</p>
<div class="sc-card">
<input class="sc-input" id="scSliceInput" type="text" value="hello world" spellcheck="false" />
<div class="sc-strip" id="scStrip"></div>
<div class="sc-result-row">
<span class="sc-code" id="scCode">buf.subarray(<b>0</b>, <b>5</b>)</span>
<span class="sc-arrow"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14"/><path d="m12 5 7 7-7 7"/></svg></span>
<span class="sc-result" id="scResult">'hello'</span>
</div>
</div>
<h3 style="margin-top:1.8rem;">concat()</h3>
<p class="sc-h3-sub">Joins two buffers into one, live.</p>
<div class="sc-card">
<div class="sc-concat-inputs">
<div class="sc-concat-col">
<span class="sc-concat-label is-a">a</span>
<input class="sc-concat-input is-a" id="scA" type="text" value="foo" spellcheck="false" />
</div>
<div class="sc-concat-col">
<span class="sc-concat-label is-b">b</span>
<input class="sc-concat-input is-b" id="scB" type="text" value="bar" spellcheck="false" />
</div>
</div>
<div class="sc-mini-strips">
<div class="sc-mini-row" id="scMiniA"></div>
<span class="sc-plus"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14"/><path d="M12 5v14"/></svg></span>
<div class="sc-mini-row" id="scMiniB"></div>
</div>
<div class="sc-combined-strip" id="scCombined"></div>
<div class="sc-result-row">
<span class="sc-code">Buffer.concat([a, b])</span>
<span class="sc-arrow"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14"/><path d="m12 5 7 7-7 7"/></svg></span>
<span class="sc-result" id="scConcatResult">'foobar'</span>
</div>
</div>
</div>
<script>
(function () {
var wrapper = document.currentScript.closest('.infographic-slicecat')
|| document.querySelector('.infographic-slicecat');
var bodyAttr = document.body.getAttribute('data-darkmode');
var dark;
if (bodyAttr === 'true') { dark = true; }
else if (bodyAttr === 'false') { dark = false; }
else {
var match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
/* ============ subarray / slice ============ */
var sliceInput = wrapper.querySelector('#scSliceInput');
var strip = wrapper.querySelector('#scStrip');
var codeEl = wrapper.querySelector('#scCode');
var resultEl = wrapper.querySelector('#scResult');
var start = 0, end = 5, picking = 'start';
function clampSelection(len) {
start = Math.min(start, Math.max(0, len - 1));
end = Math.min(end, len);
if (end <= start) end = Math.min(len, start + 1);
}
function renderStrip() {
var text = sliceInput.value;
strip.innerHTML = '';
text.split('').forEach(function (ch, i) {
var cell = document.createElement('div');
cell.className = 'sc-letter';
cell.textContent = ch === ' ' ? '\u00b7' : ch;
if (i >= start && i < end) cell.classList.add('is-picked');
cell.addEventListener('click', function () {
if (picking === 'start') {
start = i; end = i + 1; picking = 'end';
} else {
if (i < start) { start = i; end = start + 1; picking = 'end'; }
else { end = i + 1; picking = 'start'; }
}
renderStrip();
renderSliceResult();
});
strip.appendChild(cell);
});
}
function renderSliceResult() {
var text = sliceInput.value;
clampSelection(text.length);
codeEl.innerHTML = 'buf.subarray(<b>' + start + '</b>, <b>' + end + '</b>)';
resultEl.textContent = "'" + text.slice(start, end) + "'";
}
sliceInput.addEventListener('input', function () {
start = 0; end = Math.min(5, sliceInput.value.length || 1); picking = 'end';
renderStrip();
renderSliceResult();
});
renderStrip();
renderSliceResult();
/* ============ concat ============ */
var aInput = wrapper.querySelector('#scA');
var bInput = wrapper.querySelector('#scB');
var miniA = wrapper.querySelector('#scMiniA');
var miniB = wrapper.querySelector('#scMiniB');
var combined = wrapper.querySelector('#scCombined');
var concatResult = wrapper.querySelector('#scConcatResult');
function renderMini(container, text, cls) {
container.innerHTML = '';
text.split('').forEach(function (ch) {
var c = document.createElement('div');
c.className = 'sc-mini ' + cls;
c.textContent = ch === ' ' ? '\u00b7' : ch;
container.appendChild(c);
});
}
function renderCombined() {
var a = aInput.value, b = bInput.value;
renderMini(miniA, a, 'is-a');
renderMini(miniB, b, 'is-b');
combined.innerHTML = '';
var all = a.split('').map(function (ch) { return { ch: ch, cls: 'is-a' }; })
.concat(b.split('').map(function (ch) { return { ch: ch, cls: 'is-b' }; }));
all.forEach(function (item, i) {
var cell = document.createElement('div');
cell.className = 'sc-combined-cell ' + item.cls;
cell.textContent = item.ch === ' ' ? '\u00b7' : item.ch;
combined.appendChild(cell);
setTimeout(function () { cell.classList.add('is-in'); }, i * 45);
});
concatResult.textContent = "'" + a + b + "'";
}
aInput.addEventListener('input', renderCombined);
bInput.addEventListener('input', renderCombined);
renderCombined();
})();
</script>
</div>✍️ Writing Into a Buffer
const buf = Buffer.alloc(5);
buf.write('hi');
console.log(buf);
// <Buffer 68 69 00 00 00>
console.log(buf.toString());
// 'hi'.write(string)writes text into an existing buffer, starting at index 0 by default.Any bytes not written to stay at whatever they were set to — here, zero, since the buffer was created with
alloc.
<div class="infographic-bufwrite">
<style>
.infographic-bufwrite {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--charge: #c23b3b;
--charge-soft:#fbe6e6;
--radius: 10px;
box-sizing: border-box;
max-width: 880px;
margin: 0 auto;
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
color: var(--ink);
background: transparent;
}
.infographic-bufwrite[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #13171F;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--charge: #e2685f;
--charge-soft:#3a2020;
}
.infographic-bufwrite * { box-sizing: border-box; }
.infographic-bufwrite .bw-inner { padding: 0 clamp(1rem, 4vw, 1.5rem); }
.infographic-bufwrite .bw-eyebrow {
font-size: 0.7rem; font-weight: 600; letter-spacing: 0.09em;
text-transform: uppercase; color: var(--accent); margin: 0 0 0.35rem;
}
.infographic-bufwrite h2 {
font-family: 'Newsreader', Georgia, serif; font-weight: 600;
font-size: clamp(1.5rem, 4vw, 2rem); line-height: 1.15;
margin: 0 0 0.3rem; letter-spacing: -0.01em;
}
.infographic-bufwrite .bw-sub { font-size: 0.9rem; color: var(--ink-soft); margin: 0 0 1.3rem; }
.infographic-bufwrite .bw-card {
border: 1px solid var(--line); border-radius: var(--radius); background: var(--paper-alt);
padding: 1.1rem 1.15rem 1.2rem;
}
.infographic-bufwrite .bw-controls { display: flex; gap: 0.6rem; margin-bottom: 1rem; flex-wrap: wrap; align-items: flex-end; }
.infographic-bufwrite .bw-field { display: flex; flex-direction: column; gap: 0.3rem; }
.infographic-bufwrite .bw-field.is-grow { flex: 1; min-width: 140px; }
.infographic-bufwrite .bw-label {
font-size: 0.68rem; font-weight: 600; letter-spacing: 0.05em; text-transform: uppercase; color: var(--ink-soft);
}
.infographic-bufwrite .bw-input, .infographic-bufwrite .bw-num {
font-family: 'SFMono-Regular', Consolas, Menlo, monospace; font-size: 0.9rem;
padding: 0.48rem 0.65rem; border: 1px solid var(--line); border-radius: 8px;
background: var(--paper); color: var(--ink);
}
.infographic-bufwrite .bw-num { width: 64px; text-align: center; }
.infographic-bufwrite .bw-input:focus, .infographic-bufwrite .bw-num:focus { outline: 2px solid var(--accent); outline-offset: 1px; }
.infographic-bufwrite .bw-strip { display: flex; flex-wrap: wrap; gap: 0.4rem; margin-bottom: 0.5rem; }
.infographic-bufwrite .bw-cell {
width: 48px; height: 42px; border-radius: 7px; border: 1px solid var(--line);
display: flex; align-items: center; justify-content: center;
font-family: 'SFMono-Regular', Consolas, Menlo, monospace; font-weight: 600; font-size: 0.82rem;
transition: background 0.25s ease, color 0.25s ease, border-color 0.25s ease, transform 0.25s ease;
transform: scale(0.85); opacity: 0.55;
background: var(--paper); color: var(--ink-soft);
}
.infographic-bufwrite .bw-cell.is-zero { background: var(--paper); color: var(--ink-soft); opacity: 0.55; transform: scale(1); }
.infographic-bufwrite .bw-cell.is-data { background: var(--accent); border-color: var(--accent); color: #fff; opacity: 1; transform: scale(1); }
.infographic-bufwrite .bw-cut-tag {
display: inline-flex; align-items: center; gap: 0.3rem; font-size: 0.75rem; color: var(--charge);
background: var(--charge-soft); border: 1px solid var(--charge); border-radius: 999px;
padding: 0.22rem 0.65rem; margin-bottom: 0.85rem;
}
.infographic-bufwrite .bw-cut-tag svg { width: 12px; height: 12px; stroke: var(--charge); }
.infographic-bufwrite .bw-outrow {
display: flex; align-items: center; gap: 0.55rem; flex-wrap: wrap; margin-top: 0.6rem;
}
.infographic-bufwrite .bw-tag {
font-size: 0.68rem; font-weight: 700; color: var(--ink-soft); font-family: 'SFMono-Regular', Consolas, Menlo, monospace;
min-width: 118px;
}
.infographic-bufwrite .bw-out {
font-family: 'SFMono-Regular', Consolas, Menlo, monospace; font-size: 0.85rem;
background: var(--paper); border: 1px solid var(--line); border-radius: 7px;
padding: 0.4rem 0.7rem; color: var(--ink); flex: 1; min-width: 220px;
}
.infographic-bufwrite .bw-out .bw-null { color: var(--ink-soft); opacity: 0.45; }
</style>
<div class="bw-inner">
<div class="bw-card">
<div class="bw-controls">
<div class="bw-field">
<span class="bw-label">alloc(size)</span>
<input class="bw-num" id="bwSize" type="number" min="1" max="12" value="5" />
</div>
<div class="bw-field is-grow">
<span class="bw-label">.write(text)</span>
<input class="bw-input" id="bwText" type="text" value="hi" spellcheck="false" />
</div>
</div>
<div class="bw-strip" id="bwStrip"></div>
<div id="bwCutWrap"></div>
<div class="bw-outrow">
<span class="bw-tag">console.log(buf)</span>
<span class="bw-out" id="bwHexOut"></span>
</div>
<div class="bw-outrow">
<span class="bw-tag">buf.toString()</span>
<span class="bw-out" id="bwStrOut"></span>
</div>
</div>
</div>
<script>
(function () {
var wrapper = document.currentScript.closest('.infographic-bufwrite')
|| document.querySelector('.infographic-bufwrite');
var bodyAttr = document.body.getAttribute('data-darkmode');
var dark;
if (bodyAttr === 'true') { dark = true; }
else if (bodyAttr === 'false') { dark = false; }
else {
var match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
var reduced = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
var sizeInput = wrapper.querySelector('#bwSize');
var textInput = wrapper.querySelector('#bwText');
var strip = wrapper.querySelector('#bwStrip');
var cutWrap = wrapper.querySelector('#bwCutWrap');
var hexOut = wrapper.querySelector('#bwHexOut');
var strOut = wrapper.querySelector('#bwStrOut');
function esc(s) { return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>'); }
function render() {
var size = Math.max(1, Math.min(12, parseInt(sizeInput.value, 10) || 1));
sizeInput.value = size;
var text = textInput.value;
var textBytes = Array.from(new TextEncoder().encode(text));
var writeLen = Math.min(textBytes.length, size);
var truncated = textBytes.length > size;
var bytes = [];
for (var i = 0; i < size; i++) bytes.push(i < writeLen ? textBytes[i] : 0);
var cells = Array.prototype.slice.call(strip.children);
while (cells.length > size) strip.removeChild(cells.pop());
while (cells.length < size) {
var c = document.createElement('div');
c.className = 'bw-cell';
strip.appendChild(c);
cells.push(c);
}
cells.forEach(function (cell, i) {
var hex = bytes[i].toString(16).padStart(2, '0');
var isData = i < writeLen;
var delay = reduced ? 0 : i * 60;
setTimeout(function () {
cell.textContent = hex;
cell.classList.toggle('is-data', isData);
cell.classList.toggle('is-zero', !isData);
}, isData ? delay : 0);
});
cutWrap.innerHTML = truncated
? '<span class="bw-cut-tag"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"/><path d="M12 9v4"/><path d="M12 17h.01"/></svg>cut off — only ' + size + ' bytes fit</span>'
: '';
hexOut.innerHTML = '<Buffer ' + bytes.map(function (b) { return b.toString(16).padStart(2, '0'); }).join(' ') + '>';
var strHtml = "'";
for (var j = 0; j < size; j++) {
if (j < writeLen) strHtml += esc(String.fromCharCode(bytes[j]));
else strHtml += '<span class="bw-null">\u2400</span>';
}
strHtml += "'";
strOut.innerHTML = strHtml;
}
sizeInput.addEventListener('input', render);
textInput.addEventListener('input', render);
render();
})();
</script>
</div>🔍 Comparing & Searching
const a = Buffer.from('abc');
const b = Buffer.from('abc');
console.log(a.equals(b));
// true — same content
const buf = Buffer.from('hello world');
console.log(buf.indexOf('world')); // 6
console.log(buf.includes('world')); // true.equals()checks whether two buffers contain the exact same bytes — regular===won't work here, since it compares object references, not content..indexOf()and.includes()work like their string/array equivalents, searching for a value inside the buffer.
<div class="infographic-bufcmp">
<style>
.infographic-bufcmp {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--ok: #1f9d55;
--ok-soft: #e5f6ec;
--charge: #c23b3b;
--charge-soft:#fbe6e6;
--radius: 10px;
box-sizing: border-box;
max-width: 880px;
margin: 0 auto;
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
color: var(--ink);
background: transparent;
}
.infographic-bufcmp[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #13171F;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--ok: #34d399;
--ok-soft: #163227;
--charge: #e2685f;
--charge-soft:#3a2020;
}
.infographic-bufcmp * { box-sizing: border-box; }
.infographic-bufcmp .bc-inner { padding: 0 clamp(1rem, 4vw, 1.5rem); }
.infographic-bufcmp .bc-eyebrow {
font-size: 0.7rem; font-weight: 600; letter-spacing: 0.09em;
text-transform: uppercase; color: var(--accent); margin: 0 0 0.35rem;
}
.infographic-bufcmp h2 {
font-family: 'Newsreader', Georgia, serif; font-weight: 600;
font-size: clamp(1.5rem, 4vw, 2rem); line-height: 1.15;
margin: 0 0 0.3rem; letter-spacing: -0.01em;
}
.infographic-bufcmp .bc-sub { font-size: 0.9rem; color: var(--ink-soft); margin: 0 0 1.4rem; }
.infographic-bufcmp h3 {
font-family: 'Newsreader', Georgia, serif; font-weight: 600; font-size: 1.08rem; margin: 0 0 0.15rem;
}
.infographic-bufcmp .bc-h3-sub { font-size: 0.78rem; color: var(--ink-soft); margin: 0 0 0.8rem; }
.infographic-bufcmp .bc-card {
border: 1px solid var(--line); border-radius: var(--radius); background: var(--paper-alt);
padding: 1.05rem 1.1rem 1.15rem;
}
/* ---------- equals ---------- */
.infographic-bufcmp .bc-eq-inputs { display: flex; gap: 0.7rem; margin-bottom: 0.9rem; flex-wrap: wrap; }
.infographic-bufcmp .bc-eq-col { flex: 1; min-width: 130px; }
.infographic-bufcmp .bc-eq-label {
font-size: 0.68rem; font-weight: 700; font-family: 'SFMono-Regular', Consolas, Menlo, monospace;
color: var(--ink-soft); margin-bottom: 0.3rem; display: block;
}
.infographic-bufcmp .bc-eq-input {
width: 100%; font-family: 'SFMono-Regular', Consolas, Menlo, monospace; font-size: 0.9rem;
padding: 0.48rem 0.65rem; border: 1px solid var(--line); border-radius: 8px;
background: var(--paper); color: var(--ink);
}
.infographic-bufcmp .bc-eq-input:focus { outline: 2px solid var(--accent); outline-offset: 1px; }
.infographic-bufcmp .bc-eq-strips { display: flex; flex-direction: column; gap: 0.35rem; margin-bottom: 0.9rem; }
.infographic-bufcmp .bc-eq-row { display: flex; gap: 0.3rem; flex-wrap: wrap; }
.infographic-bufcmp .bc-eq-cell {
width: 34px; height: 36px; border-radius: 6px; border: 1px dashed var(--line);
display: flex; align-items: center; justify-content: center;
font-family: 'SFMono-Regular', Consolas, Menlo, monospace; font-weight: 700; font-size: 0.85rem;
color: var(--ink-soft); background: var(--paper); transition: all 0.2s ease;
}
.infographic-bufcmp .bc-eq-cell.is-match { background: var(--ok-soft); border: 1px solid var(--ok); color: var(--ok); }
.infographic-bufcmp .bc-eq-cell.is-diff { background: var(--charge-soft); border: 1px solid var(--charge); color: var(--charge); }
.infographic-bufcmp .bc-eq-cell.is-empty { border-style: dashed; opacity: 0.4; }
.infographic-bufcmp .bc-bool {
display: inline-flex; align-items: center; gap: 0.4rem; font-family: 'SFMono-Regular', Consolas, Menlo, monospace;
font-size: 0.88rem; font-weight: 700; padding: 0.4rem 0.8rem; border-radius: 999px;
}
.infographic-bufcmp .bc-bool.is-true { background: var(--ok-soft); color: var(--ok); border: 1px solid var(--ok); }
.infographic-bufcmp .bc-bool.is-false { background: var(--charge-soft); color: var(--charge); border: 1px solid var(--charge); }
.infographic-bufcmp .bc-code {
font-family: 'SFMono-Regular', Consolas, Menlo, monospace; font-size: 0.82rem; color: var(--ink-soft); margin-right: 0.55rem;
}
/* ---------- search ---------- */
.infographic-bufcmp .bc-search-inputs { display: flex; gap: 0.7rem; margin-bottom: 0.9rem; flex-wrap: wrap; }
.infographic-bufcmp .bc-search-col { flex: 1; min-width: 130px; }
.infographic-bufcmp .bc-search-col.is-narrow { flex: 0 0 130px; }
.infographic-bufcmp .bc-search-strip { display: flex; flex-wrap: wrap; gap: 0.28rem; margin-bottom: 0.3rem; }
.infographic-bufcmp .bc-search-cell {
width: 30px; height: 34px; border-radius: 6px; border: 1px solid var(--line);
display: flex; align-items: center; justify-content: center;
font-family: 'SFMono-Regular', Consolas, Menlo, monospace; font-weight: 600; font-size: 0.8rem;
color: var(--ink-soft); background: var(--paper); transition: all 0.2s ease;
}
.infographic-bufcmp .bc-search-cell.is-match { background: var(--accent); border-color: var(--accent); color: #fff; }
.infographic-bufcmp .bc-idx-marker { font-size: 0.66rem; color: var(--accent); font-weight: 700; margin-bottom: 0.7rem; min-height: 1em; font-family: 'SFMono-Regular', Consolas, Menlo, monospace; }
.infographic-bufcmp .bc-results { display: flex; gap: 0.55rem; flex-wrap: wrap; }
</style>
<div class="bc-inner">
<h3>equals()</h3>
<p class="bc-h3-sub">Edit either buffer — mismatches turn red.</p>
<div class="bc-card">
<div class="bc-eq-inputs">
<div class="bc-eq-col">
<span class="bc-eq-label">a</span>
<input class="bc-eq-input" id="eqA" type="text" value="abc" spellcheck="false" />
</div>
<div class="bc-eq-col">
<span class="bc-eq-label">b</span>
<input class="bc-eq-input" id="eqB" type="text" value="abc" spellcheck="false" />
</div>
</div>
<div class="bc-eq-strips">
<div class="bc-eq-row" id="eqRowA"></div>
<div class="bc-eq-row" id="eqRowB"></div>
</div>
<span class="bc-code">a.equals(b)</span>
<span class="bc-bool" id="eqResult">true</span>
</div>
<h3 style="margin-top:1.8rem;">indexOf() / includes()</h3>
<p class="bc-h3-sub">Type a buffer and a term to find in it.</p>
<div class="bc-card">
<div class="bc-search-inputs">
<div class="bc-search-col">
<span class="bc-eq-label">buf</span>
<input class="bc-eq-input" id="srcText" type="text" value="hello world" spellcheck="false" />
</div>
<div class="bc-search-col is-narrow">
<span class="bc-eq-label">find</span>
<input class="bc-eq-input" id="findText" type="text" value="world" spellcheck="false" />
</div>
</div>
<div class="bc-search-strip" id="searchStrip"></div>
<div class="bc-idx-marker" id="idxMarker"></div>
<div class="bc-results">
<span><span class="bc-code">buf.indexOf(find)</span><span class="bc-bool" id="idxResult">6</span></span>
<span><span class="bc-code">buf.includes(find)</span><span class="bc-bool" id="inclResult">true</span></span>
</div>
</div>
</div>
<script>
(function () {
var wrapper = document.currentScript.closest('.infographic-bufcmp')
|| document.querySelector('.infographic-bufcmp');
var bodyAttr = document.body.getAttribute('data-darkmode');
var dark;
if (bodyAttr === 'true') { dark = true; }
else if (bodyAttr === 'false') { dark = false; }
else {
var match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
/* ============ equals() ============ */
var eqA = wrapper.querySelector('#eqA');
var eqB = wrapper.querySelector('#eqB');
var rowA = wrapper.querySelector('#eqRowA');
var rowB = wrapper.querySelector('#eqRowB');
var eqResult = wrapper.querySelector('#eqResult');
function renderEq() {
var a = eqA.value, b = eqB.value;
var len = Math.max(a.length, b.length);
rowA.innerHTML = ''; rowB.innerHTML = '';
var allMatch = a.length === b.length;
for (var i = 0; i < len; i++) {
var ca = a[i], cb = b[i];
var match = ca !== undefined && cb !== undefined && ca === cb;
if (!match) allMatch = false;
var cellA = document.createElement('div');
cellA.className = 'bc-eq-cell' + (ca === undefined ? ' is-empty' : (match ? ' is-match' : ' is-diff'));
cellA.textContent = ca === undefined ? '' : (ca === ' ' ? '\u00b7' : ca);
rowA.appendChild(cellA);
var cellB = document.createElement('div');
cellB.className = 'bc-eq-cell' + (cb === undefined ? ' is-empty' : (match ? ' is-match' : ' is-diff'));
cellB.textContent = cb === undefined ? '' : (cb === ' ' ? '\u00b7' : cb);
rowB.appendChild(cellB);
}
eqResult.textContent = allMatch ? 'true' : 'false';
eqResult.className = 'bc-bool ' + (allMatch ? 'is-true' : 'is-false');
}
eqA.addEventListener('input', renderEq);
eqB.addEventListener('input', renderEq);
renderEq();
/* ============ indexOf / includes ============ */
var srcText = wrapper.querySelector('#srcText');
var findText = wrapper.querySelector('#findText');
var searchStrip = wrapper.querySelector('#searchStrip');
var idxMarker = wrapper.querySelector('#idxMarker');
var idxResult = wrapper.querySelector('#idxResult');
var inclResult = wrapper.querySelector('#inclResult');
function renderSearch() {
var src = srcText.value;
var find = findText.value;
var idx = find.length ? src.indexOf(find) : -1;
searchStrip.innerHTML = '';
idxMarker.innerHTML = '';
var markerSlots = [];
src.split('').forEach(function (ch, i) {
var cell = document.createElement('div');
cell.className = 'bc-search-cell';
var isMatch = idx !== -1 && i >= idx && i < idx + find.length;
if (isMatch) cell.classList.add('is-match');
cell.textContent = ch === ' ' ? '\u00b7' : ch;
searchStrip.appendChild(cell);
markerSlots.push(i === idx ? '\u25b2 ' + idx : '\u00a0');
});
if (idx !== -1) {
var spacer = '';
for (var k = 0; k < idx; k++) spacer += '\u2003';
idxMarker.textContent = spacer + '\u25b2 index ' + idx;
} else {
idxMarker.textContent = 'not found';
}
idxResult.textContent = String(idx);
idxResult.className = 'bc-bool ' + (idx === -1 ? 'is-false' : 'is-true');
inclResult.textContent = String(idx !== -1);
inclResult.className = 'bc-bool ' + (idx !== -1 ? 'is-true' : 'is-false');
}
srcText.addEventListener('input', renderSearch);
findText.addEventListener('input', renderSearch);
renderSearch();
})();
</script>
</div>💡 Why Buffers Matter
📁 Files —
fs.readFile()returns a buffer unless you specify an encoding🌐 Network — incoming HTTP request bodies and TCP data arrive as buffers, before any decoding
🖼️ Binary formats — images, audio, PDFs, and other non-text files are handled as raw bytes
🔐 Crypto — hashing and encryption operate on bytes, not text
const fs = require('fs');
const data = fs.readFileSync('note.txt');
// no encoding → returns a Buffer
console.log(data);
// <Buffer 48 65 6c 6c 6f>
console.log(data.toString());
// 'Hello'<div class="infographic-bufread">
<style>
.infographic-bufread {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--ok: #1f9d55;
--ok-soft: #e5f6ec;
--radius: 10px;
box-sizing: border-box;
max-width: 880px;
margin: 0 auto;
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
color: var(--ink);
background: transparent;
}
.infographic-bufread[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #13171F;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
--ok: #34d399;
--ok-soft: #163227;
}
.infographic-bufread * { box-sizing: border-box; }
.infographic-bufread .br-inner { padding: 0 clamp(1rem, 4vw, 1.5rem); }
.infographic-bufread .br-eyebrow {
font-size: 0.7rem; font-weight: 600; letter-spacing: 0.09em;
text-transform: uppercase; color: var(--accent); margin: 0 0 0.35rem;
}
.infographic-bufread h2 {
font-family: 'Newsreader', Georgia, serif; font-weight: 600;
font-size: clamp(1.5rem, 4vw, 2rem); line-height: 1.15;
margin: 0 0 0.3rem; letter-spacing: -0.01em;
}
.infographic-bufread .br-sub { font-size: 0.9rem; color: var(--ink-soft); margin: 0 0 1.3rem; }
.infographic-bufread .br-card {
border: 1px solid var(--line); border-radius: var(--radius); background: var(--paper-alt);
padding: 1.1rem 1.15rem 1.2rem;
}
/* file box + input */
.infographic-bufread .br-file-row { display: flex; align-items: center; gap: 0.6rem; margin-bottom: 0.6rem; }
.infographic-bufread .br-file-icon {
flex: none; width: 34px; height: 34px; border-radius: 8px; background: var(--paper);
border: 1px solid var(--line); display: flex; align-items: center; justify-content: center;
box-shadow: 0 1px 3px rgba(0,0,0,0.10), 0 1px 1px rgba(0,0,0,0.06);
}
.infographic-bufread[data-theme="dark"] .br-file-icon { box-shadow: 0 1px 4px rgba(0,0,0,0.45); }
.infographic-bufread .br-file-icon svg { width: 17px; height: 17px; stroke: var(--accent); }
.infographic-bufread .br-file-name { font-family: 'SFMono-Regular', Consolas, Menlo, monospace; font-size: 0.85rem; font-weight: 700; }
.infographic-bufread .br-file-input {
flex: 1; font-family: 'SFMono-Regular', Consolas, Menlo, monospace; font-size: 0.88rem;
padding: 0.4rem 0.6rem; border: 1px solid var(--line); border-radius: 7px;
background: var(--paper); color: var(--ink);
}
.infographic-bufread .br-file-input:focus { outline: 2px solid var(--accent); outline-offset: 1px; }
/* encoding toggle */
.infographic-bufread .br-toggle-row { display: flex; align-items: center; gap: 0.55rem; margin: 1rem 0 1.1rem; }
.infographic-bufread .br-toggle-label { font-size: 0.78rem; color: var(--ink-soft); font-family: 'SFMono-Regular', Consolas, Menlo, monospace; }
.infographic-bufread .br-switch {
position: relative; width: 148px; height: 32px; border-radius: 999px; background: var(--paper);
border: 1px solid var(--line); cursor: pointer; display: flex; align-items: center; padding: 2px;
}
.infographic-bufread .br-switch-thumb {
position: absolute; top: 2px; left: 2px; width: 72px; height: 26px; border-radius: 999px;
background: var(--accent); transition: transform 0.25s ease;
}
.infographic-bufread .br-switch.is-utf8 .br-switch-thumb { transform: translateX(72px); }
.infographic-bufread .br-switch-opt {
position: relative; z-index: 1; width: 50%; text-align: center; font-size: 0.68rem; font-weight: 700;
font-family: 'SFMono-Regular', Consolas, Menlo, monospace; color: var(--ink-soft); transition: color 0.2s ease;
}
.infographic-bufread .br-switch:not(.is-utf8) .br-switch-opt.is-none { color: #fff; }
.infographic-bufread .br-switch.is-utf8 .br-switch-opt.is-utf8t { color: #fff; }
/* pipeline */
.infographic-bufread .br-pipeline { display: flex; align-items: center; gap: 0.6rem; flex-wrap: wrap; margin-bottom: 0.9rem; }
.infographic-bufread .br-stage {
font-family: 'SFMono-Regular', Consolas, Menlo, monospace; font-size: 0.78rem;
background: var(--paper); border: 1px solid var(--line); border-radius: 8px;
padding: 0.4rem 0.7rem; color: var(--ink-soft);
}
.infographic-bufread .br-pipe-arrow { color: var(--ink-soft); flex: none; }
.infographic-bufread .br-pipe-arrow svg { width: 15px; height: 15px; stroke: var(--ink-soft); }
/* result area */
.infographic-bufread .br-result-label {
font-size: 0.68rem; font-weight: 700; letter-spacing: 0.05em; text-transform: uppercase;
color: var(--ink-soft); margin: 0 0 0.4rem;
}
.infographic-bufread .br-byterow { display: flex; flex-wrap: wrap; gap: 0.35rem; margin-bottom: 0.7rem; }
.infographic-bufread .br-byte {
width: 40px; height: 36px; border-radius: 6px; background: var(--accent); color: #fff;
display: flex; align-items: center; justify-content: center;
font-family: 'SFMono-Regular', Consolas, Menlo, monospace; font-weight: 600; font-size: 0.78rem;
opacity: 0; transform: scale(0.7); transition: opacity 0.3s ease, transform 0.3s ease;
}
.infographic-bufread .br-byte.is-in { opacity: 1; transform: scale(1); }
.infographic-bufread .br-tostring-row { display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.4rem; flex-wrap: wrap; }
.infographic-bufread .br-code { font-family: 'SFMono-Regular', Consolas, Menlo, monospace; font-size: 0.8rem; color: var(--ink-soft); }
.infographic-bufread .br-strchip {
font-family: 'SFMono-Regular', Consolas, Menlo, monospace; font-size: 0.88rem; font-weight: 700;
color: var(--ok); background: var(--ok-soft); border: 1px solid var(--ok);
border-radius: 7px; padding: 0.35rem 0.7rem;
}
.infographic-bufread .br-note-tag {
font-size: 0.7rem; color: var(--ink-soft); font-style: italic;
}
</style>
<div class="br-inner">
<div class="br-card">
<div class="br-file-row">
<span class="br-file-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z"/><path d="M14 2v5a1 1 0 0 0 1 1h5"/><path d="M10 9H8"/><path d="M16 13H8"/><path d="M16 17H8"/></svg></span>
<span class="br-file-name">note.txt</span>
<input class="br-file-input" id="brContent" type="text" value="Hello" spellcheck="false" />
</div>
<div class="br-toggle-row">
<span class="br-toggle-label">fs.readFileSync('note.txt',</span>
<div class="br-switch" id="brSwitch">
<span class="br-switch-thumb"></span>
<span class="br-switch-opt is-none">none</span>
<span class="br-switch-opt is-utf8t">'utf8'</span>
</div>
<span class="br-toggle-label">)</span>
</div>
<div class="br-pipeline">
<span class="br-stage">note.txt</span>
<span class="br-pipe-arrow"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14"/><path d="m12 5 7 7-7 7"/></svg></span>
<span class="br-stage">readFileSync()</span>
<span class="br-pipe-arrow"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14"/><path d="m12 5 7 7-7 7"/></svg></span>
<span class="br-stage" id="brStageResult">Buffer</span>
</div>
<p class="br-result-label" id="brResultLabel">console.log(data)</p>
<div class="br-byterow" id="brByteRow"></div>
<div class="br-tostring-row" id="brToStringRow">
<span class="br-code">data.toString()</span>
<span class="br-strchip" id="brStrChip">'Hello'</span>
</div>
<p class="br-note-tag" id="brNote"></p>
</div>
</div>
<script>
(function () {
var wrapper = document.currentScript.closest('.infographic-bufread')
|| document.querySelector('.infographic-bufread');
var bodyAttr = document.body.getAttribute('data-darkmode');
var dark;
if (bodyAttr === 'true') { dark = true; }
else if (bodyAttr === 'false') { dark = false; }
else {
var match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) wrapper.setAttribute('data-theme', 'dark');
var reduced = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
var contentInput = wrapper.querySelector('#brContent');
var switchEl = wrapper.querySelector('#brSwitch');
var stageResult = wrapper.querySelector('#brStageResult');
var resultLabel = wrapper.querySelector('#brResultLabel');
var byteRow = wrapper.querySelector('#brByteRow');
var toStringRow = wrapper.querySelector('#brToStringRow');
var strChip = wrapper.querySelector('#brStrChip');
var note = wrapper.querySelector('#brNote');
var utf8Mode = false;
switchEl.addEventListener('click', function () {
utf8Mode = !utf8Mode;
switchEl.classList.toggle('is-utf8', utf8Mode);
render();
});
function esc(s) { return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>'); }
function render() {
var text = contentInput.value;
var bytes = Array.from(new TextEncoder().encode(text));
if (utf8Mode) {
stageResult.textContent = 'String';
resultLabel.textContent = 'console.log(data)';
byteRow.innerHTML = '';
byteRow.style.display = 'none';
toStringRow.innerHTML =
'<span class="br-code"></span><span class="br-strchip">\'' + esc(text) + '\'</span>';
note.textContent = 'already a string — no .toString() needed';
} else {
stageResult.textContent = 'Buffer';
resultLabel.textContent = 'console.log(data)';
byteRow.style.display = '';
byteRow.innerHTML = '';
bytes.forEach(function (b, i) {
var cell = document.createElement('div');
cell.className = 'br-byte';
cell.textContent = b.toString(16).padStart(2, '0');
byteRow.appendChild(cell);
var delay = reduced ? 0 : i * 50;
setTimeout(function () { cell.classList.add('is-in'); }, delay);
});
toStringRow.innerHTML =
'<span class="br-code">data.toString()</span><span class="br-strchip">\'' + esc(text) + '\'</span>';
note.textContent = '';
}
}
contentInput.addEventListener('input', render);
render();
})();
</script>
</div>🌍 Real-Life Examples
1️⃣ Saving a Base64 Image (from an API or form upload)
Frontends often send images as base64 text — a buffer converts that back into real image bytes to save as a file.
const fs = require('fs');
const base64Image = 'iVBORw0KGgoAAAANSUhEUgAAAAUA...';
// shortened
const imgBuffer = Buffer.from(base64Image, 'base64');
fs.writeFileSync('photo.png', imgBuffer);
console.log('🖼️ Image saved!');The base64 string is decoded straight into binary image data — no intermediate steps needed.
This is exactly what happens behind the scenes when an app lets users upload a profile picture via a JSON API.
2️⃣ Checking a File's Real Type by Its Magic Bytes
File extensions can lie — the first few bytes of a file (its "magic number") reveal what it actually is. This is how tools verify uploads instead of trusting the filename.
const fs = require('fs');
const buf = fs.readFileSync('mystery-file');
const isPNG = buf.slice(0, 8).equals(Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]));
console.log(isPNG ? '✅ This is a real PNG' : '❌ Not a PNG');Every PNG file starts with the same 8 bytes, regardless of its filename or extension.
Comparing raw bytes like this is far more reliable than checking if a filename ends in
.png— someone could rename any file tophoto.png.
3️⃣ Reassembling a File Upload from Streamed Chunks
Large uploads (or any HTTP body) arrive in pieces. Buffers collect and combine them once the full file has arrived.
const http = require('http');
const server = http.createServer((req, res) => {
const chunks = [];
req.on('data', chunk => chunks.push(chunk));
req.on('end', () => {
const fileBuffer = Buffer.concat(chunks);
console.log(`📦 Received ${fileBuffer.length} bytes`);
res.end('Upload received!');
});
});
server.listen(3000);Each
chunkis already a buffer —Buffer.concat()stitches every piece back into one complete file.This pattern underlies how frameworks like Express handle raw file uploads before any parsing library gets involved.
4️⃣ Measuring the Real Size of Text (Emoji-Safe)
.length on a string counts characters, not bytes — that's wrong for anything with emoji or accented characters. A buffer gives the true byte size, which matters for things like database column limits.
const text = 'Hello 👋';
console.log(text.length);
// 8 — JS counts the emoji as 2 code units
console.log(Buffer.byteLength(text, 'utf8'));
// 10 — actual bytes when stored/sentBuffer.byteLength()tells you exactly how much space the text will take up once encoded — the number that actually matters for storage limits or network payload size.
5️⃣ Hashing a File (Checking Integrity)
Verifying a downloaded file wasn't corrupted or tampered with means hashing its raw bytes — not its text — since files aren't always text.
const fs = require('fs');
const crypto = require('crypto');
const fileBuffer = fs.readFileSync('installer.exe');
const hash = crypto.createHash('sha256').update(fileBuffer).digest('hex');
console.log('🔒 SHA-256:', hash);readFileSyncwithout an encoding returns a buffer — exactly whatcreateHash().update()expects.This is the same technique behind the "checksum" values software sites publish next to downloads, so you can confirm your copy matches theirs.
6️⃣ Reading a File's Header to Identify Its Format
Beyond just checking "is this a PNG," buffers let you read structured binary formats byte by byte — like pulling metadata out of a WAV audio file's header.
const fs = require('fs');
const buf = fs.readFileSync('song.wav');
const chunkId = buf.toString('ascii', 0, 4);
// 'RIFF'
const format = buf.toString('ascii', 8, 12);
// 'WAVE'
const sampleRate = buf.readUInt32LE(24);
// e.g. 44100
console.log({ chunkId, format, sampleRate });.toString(encoding, start, end)reads just a slice of the buffer as text — WAV headers store labels like'RIFF'and'WAVE'as plain ASCII at fixed positions..readUInt32LE(offset)reads 4 bytes at a given position as a number (little-endian) — this is how the sample rate is actually stored in the file, as raw bytes rather than text.This same byte-reading approach is how libraries parse image dimensions, video metadata, or any binary file format with a fixed header layout.
7️⃣ Compressing Data Before Sending It
Compression algorithms work on raw bytes, so buffers are the natural input and output for something like gzip.
const zlib = require('zlib');
const original = Buffer.from('a'.repeat(1000));
// 1000 bytes
const compressed = zlib.gzipSync(original);
console.log(`Original: ${original.length} bytes`);
console.log(`Compressed: ${compressed.length} bytes`);
const restored = zlib.gunzipSync(compressed);
console.log(restored.toString().length);
// 1000 — back to the originalgzipSynctakes a buffer in and returns a smaller, compressed buffer out — this is exactly what happens when a server gzips a response before sending it over the network.gunzipSyncreverses it — a browser or client does this automatically when it receives aContent-Encoding: gzipresponse.