IlmHamroh
JavaScript Full-stack/24-qism. Node.js29/55-dars16 daqiqa
Mundarija (26)

Node.js Buffer: baytlar, UTF-8, base64, hex va binar ma'lumot

Qisqacha: Buffer — Node'dagi baytlar massivi (aslida Uint8Array ning kengaytmasi). Fayl, tarmoq va siqilgan ma'lumot baytlarda keladi; matn bo'lishi uchun ular kodlash (encoding) bilan o'qiladi — odatda UTF-8. Bir belgi bir bayt emas: "so'm" — 4 bayt, ʻ (U+02BB) bilan — 5 bayt. Ko'p baytli belgi ikki bo'lak orasida bo'linsa, har bo'lakni alohida toString() qilish matnni buzadi — StringDecoder yoki Buffer.concat kerak.

Bu darsda

  • Buffer.from, Buffer.alloc va allocUnsafe bilan bufer yaratasiz va farqini bilasiz.
  • utf8, base64, base64url, hex, latin1 kodlashlari orasida o'girasiz.
  • Satr uzunligi (length) va bayt hajmi (byteLength) nega farq qilishini tushuntirasiz.
  • subarray umumiy xotira ekanini, Buffer.concat va StringDecoder qachon kerakligini bilasiz.
  • Sonlarni baytlarga yozib-o'qiysiz (writeUInt32BE, readDoubleLE).

Oldin bilishingiz kerak: Matn kodlash: ASCII, Unicode va UTF-8, Typed arrays va binar ma'lumot, Unicode va emoji, crypto 1: hash va HMAC.

1. Nega bu kerak?

Kompyuter matnni bilmaydi — u faqat baytlarni biladi: 0 dan 255 gacha sonlar. Fayl diskda — baytlar. Tarmoq orqali kelgan javob — baytlar. Siqilgan .gz fayl — baytlar. "salom" degan matn — ular faqat siz ma'lum bir qoida (kodlash) bilan o'qiganingizdagina.

Oldingi darslarda baytlarni ko'p uchratdingiz, lekin ichiga qaramadik:

  • child_process da encoding: "utf8" berilmasa, execFileSync satr emas, <Buffer 34 32 0a> qaytaradi.
  • net da soketdan kelgan chunk ni String(chunk) qildik.
  • valyuta testida: chiqish.on("data", (b: Buffer) => (matn += b.toString())).

Bu darsda o'sha Buffer ning ichini ochamiz. Sabab amaliy: o'zbekcha matn bilan ishlaganda baytlar va belgilar soni farq qiladi va buni bilmagan dastur o'zbek harflarini buzadi.

O'xshatish: Buffer — bir qator kataklar, har katakda 0–255 oralig'idagi bitta son. Kodlash — shu sonlarni harflarga aylantiradigan lug'at. Bir xil kataklar UTF-8 lug'ati bilan "soʻm", latin1 lug'ati bilan "soÊ»m" bo'ladi.

2. Buffer yaratish

2.1 Matndan va sonlardan

js
const fromText = Buffer.from("salom");
const fromBytes = Buffer.from([115, 97, 108, 111, 109]);

console.log(fromText); // <Buffer 73 61 6c 6f 6d>
console.log(fromBytes.toString()); // salom
console.log(fromText.length); // 5
console.log(fromText[0]); // 115

Node bufer ichini o'n oltilik (hex) sonlarda ko'rsatadi: 73 = 115 = "s". Buffer.from(satr) sukut bo'yicha UTF-8 bilan kodlaydi, toString() sukut bo'yicha UTF-8 bilan o'qiydi. buf[0] — bitta bayt, oddiy son.

Buffer — Uint8Array ning bolasi (Typed arrays). Shuning uchun massiv metodlarining ko'pi ishlaydi: indeks, length, for…of. Kanon tajribasi: Buffer instanceof Uint8Array — true (t29-buffer.txt).

2.2 alloc va allocUnsafe

Bo'sh joy kerak bo'lsa:

js
const safe = Buffer.alloc(4);
const filled = Buffer.alloc(5, "ab");
console.log(safe); // <Buffer 00 00 00 00>
console.log(filled.toString()); // ababa
Funksiya Ichida Tezlik
Buffer.alloc(n) nollar bilan to'ldirilgan biroz sekinroq
Buffer.allocUnsafe(n) eski xotira qoldig'i bo'lishi mumkin tezroq

allocUnsafe xotirani tozalamaydi: ichida oldin boshqa ma'lumot (parol, token, boshqa foydalanuvchining so'rovi) turgan bo'lishi mumkin. Agar uni to'liq to'ldirmasdan tashqariga yuborsangiz — o'sha qoldiq ham ketadi. Shuning uchun qoida: alloc ishlating. allocUnsafe faqat keyingi qatorda butun buferni o'zingiz to'ldirasiz degan aniq holatda.

Eski kodda new Buffer(10) ni ko'rasiz — bu eskirgan (deprecated) va xavfli edi: aynan shu "tozalanmagan xotira" muammosi sabab alloc/allocUnsafe ga bo'lingan.

3. Kodlashlar

3.1 Beshta asosiy kodlash

Bir xil baytlarni turli ko'rinishda yozish mumkin:

js
const buf = Buffer.from("salom");
console.log(buf.toString("hex")); // 73616c6f6d
console.log(buf.toString("base64")); // c2Fsb20=
console.log(buf.toString("base64url")); // c2Fsb20
console.log(Buffer.from("c2Fsb20=", "base64").toString()); // salom
Kodlash Nima Qayerda
utf8 (sukut) Unicode matn, 1–4 bayt/belgi deyarli hamma matn
hex har bayt — 2 ta 0–9a–f belgi hash'lar, debug
base64 3 bayt → 4 belgi (A–Z a–z 0–9 + /, =) email ilovalari, data: URL, JSON ichida binar
base64url base64, lekin - _, = siz URL va JWT tokenlar
latin1 1 bayt = 1 belgi (0–255) eski protokollar

base64 — binar ma'lumotni faqat "xavfsiz" harflar bilan yozish usuli. Hajmi ~33 % ga oshadi (3 bayt → 4 belgi), lekin JSON yoki URL ichida buzilmaydi. base64url farqi: + va / URL'da maxsus ma'noga ega, shuning uchun ular - va _ ga almashadi, oxiridagi = tashlanadi. Kanon misoli: "??>>" — base64 da Pz8+Pg==, base64url da Pz8-Pg.

hex ni crypto 1 darsida ko'rgansiz: valyuta ning kesh kaliti — createHash("sha256").update(url).digest("hex").slice(0, 16). digest() aslida Buffer qaytaradi, "hex" uni o'qiladigan satrga aylantiradi.

3.2 Noto'g'ri kodlash — buzilgan matn

Kodlash o'qishda ham, yozishda ham bir xil bo'lishi shart. Aks holda — mojibake (buzilgan belgilar):

js
const bytes = Buffer.from("so\u02BBm"); // UTF-8 bilan yozildi
console.log(bytes.toString("utf8")); // soʻm
console.log(bytes.toString("latin1")); // soʻm

Bir xil baytlar, ikki xil lug'at. UTF-8 da ca bb — bitta belgi (U+02BB), latin1 da esa ikkita: Ê va ». Sayt yoki Excel faylida "ü", "Ê»" kabi belgilarni ko'rsangiz — bu aynan shu: UTF-8 baytlar boshqa kodlash bilan o'qilgan. Kanon tajribasida: Buffer.from("soʻm", "latin1") → so�m — bu safar teskari yo'nalish (latin1 ga sig'maydigan belgi buzildi).

Tekshirib ko'ring: 30 baytli rasmni base64 ga o'girsangiz, natija necha belgi bo'ladi?

Javob

40 belgi. Base64 har 3 baytni 4 belgiga aylantiradi: 30 ÷ 3 × 4 = 40. Bayt soni 3 ga bo'linmasa, oxiriga = qo'shiladi (base64url da qo'shilmaydi).

4. length va byteLength: o'zbek harflari

4.1 Uch xil "uzunlik"

Unicode va emoji darsida satr length i belgilarni emas, UTF-16 birliklarini sanashini ko'rgansiz. Endi uchinchi o'lchov — UTF-8 baytlar:

js
const text = "Osh — 35 000 so'm 🍚";
console.log(text.length); // 20
console.log([...text].length); // 19
console.log(Buffer.byteLength(text)); // 24
  • [...text].length — 19: haqiqiy belgilar soni.
  • text.length — 20: emoji JavaScript ichida 2 birlik.
  • Buffer.byteLength — 24: UTF-8 da tire — 3 bayt, emoji 4 bayt, qolganlari 1 baytdan.

Qaysi biri muhim? Baytlar — diskda, tarmoqda va bazada joy aynan bayt bilan o'lchanadi. Content-Length sarlavhasi, "SMS 160 belgi", "maydon 255 bayt" — hammasi bayt.

4.2 Tutuq belgisi: ' yoki ʻ

O'zbek lotin alifbosida o' va g' uchun ikki xil belgi ishlatiladi. Kanon tajribasi (t29-buffer.txt, Node 24.21.0):

text
"Oʻzbekiston soʻmi — so'm": 24 belgi (UTF-16), 28 bayt (UTF-8); ʻ (U+02BB) = cabb, ' = 27
  • Oddiy apostrof ' (U+0027) — ASCII, 1 bayt (27).
  • O'zbek tutuq belgisi ʻ (U+02BB, "modifier letter turned comma") — 2 bayt (ca bb).
js
const plain = "O'zbekiston";
const turned = "O\u02BBzbekiston";
console.log(plain.length, Buffer.byteLength(plain)); // 11 11
console.log(turned.length, Buffer.byteLength(turned)); // 11 12

Ko'zga bir xil, belgilar soni bir xil, lekin baytlar har xil. Amaliy natijalari: 255 baytli maydonga sig'ish hisobi, "o'" ni qidirganda ʻ li matn topilmaydi (boshqa belgi!), fayl nomlarida turli tizimlar turlicha ko'rsatadi. IlmHamroh kursi matnida oddiy ' ishlatiladi. Tashqi manbalar esa uchinchi belgini ham ishlatadi — valyuta ning CBU ma'lumotida aynan shunday (pastdagi 4-mashqda biz topgan natija).

Brauzerda Buffer yo'q, lekin xuddi shu hisobni TextEncoder beradi — bu blok saytda ham ishlaydi:

js
const encoder = new TextEncoder();
console.log(encoder.encode("so'm").length);
console.log(encoder.encode("so\u02BBm").length);
console.log(encoder.encode("so\u02BBm"));

Konsolda:

text
4
5
Uint8Array(5) [ 115, 111, 202, 187, 109 ]

TextEncoder doim UTF-8 bilan Uint8Array qaytaradi. Brauzer konsoli massivni boshqacha ko'rsatishi mumkin — ma'nosi bir xil.

Tekshirib ko'ring: Bazadagi maydon "100 baytgacha". Foydalanuvchi 60 belgili o'zbekcha nom yozdi, ichida 6 ta ʻ bor, qolgani lotin harflari. Sig'adimi?

Javob

Ha: 54 belgi × 1 bayt + 6 × 2 bayt = 66 bayt. Lekin nomda emoji yoki kirill harflari (2 bayt) bo'lsa, hisob o'zgaradi. Tekshiruvni belgi soni bilan emas, Buffer.byteLength(nom) bilan qiling.

5. Bo'laklar: subarray, concat va bo'lingan belgi

5.1 subarray — nusxa emas

js
const original = Buffer.from([1, 2, 3, 4]);
const part = original.subarray(1, 3);
part[0] = 99;
console.log(original); // <Buffer 01 63 03 04>

subarray yangi bufer yaratmaydi — o'sha xotiraning bir qismiga "deraza" ochadi. part ni o'zgartirdik — original ham o'zgardi (63 = 99). Kanon tajribasida ham aynan shu natija. Bu tez (nusxa yo'q), lekin kutilmagan o'zgarish manbai.

Diqqat: Buffer da slice() ham umumiy xotira beradi (u eskirgan, subarray bilan bir xil), Uint8Array dagi slice() esa nusxa oladi. Bir xil nom, ikki xil xulq — shuning uchun Node hujjati subarray ni tavsiya qiladi, nusxa kerak bo'lsa — Buffer.from(buf).

5.2 Buffer.concat — bo'laklarni birlashtirish

Oqimdan bo'laklar kelsa, ularni yig'ib, bitta buferga birlashtirish mumkin:

js
const parts = [Buffer.from("osh "), Buffer.from("manti")];
const all = Buffer.concat(parts);
console.log(all.toString(), all.length); // osh manti 9

5.3 Bo'lingan belgi: eng ko'p uchraydigan xato

Endi muhim tuzoq. "soʻm" ning 5 bayti tarmoqdan ikki bo'lakda keldi va bo'lak chegarasi aynan ʻ ning o'rtasiga tushdi: 73 6f ca | bb 6d. Har bo'lakni alohida matnga aylantirsak:

js
import { StringDecoder } from "node:string_decoder";

const chunks = [
  Buffer.from([0x73, 0x6f, 0xca]),
  Buffer.from([0xbb, 0x6d]),
];

// ❌ har bo'lakni alohida
console.log(chunks.map((c) => c.toString()).join(""));
// ✅ avval baytlarni birlashtirish
console.log(Buffer.concat(chunks).toString());
// ✅ StringDecoder — chala belgini keyingi bo'lakkacha saqlaydi
const decoder = new StringDecoder("utf8");
const parts = chunks.map((c) => decoder.write(c));
console.log(parts.join("") + decoder.end());

Konsolda:

text
so��m
soʻm
soʻm

Birinchi usulda ca yolg'iz qoldi — UTF-8 da u "davomi bor" degan bayt, davomisiz u yaroqsiz va � (almashtirish belgisi) ga aylanadi. bb ham yolg'iz — yana �. Ikkita buzilgan belgi.

Diagrammada ikki yo'lni solishtiring: yuqorida har bo'lak alohida o'qiladi, pastda StringDecoder chala baytni keyingi bo'lakkacha ushlab turadi.

flowchart LR
  subgraph A["har bo'lak alohida toString"]
    A1["73 6f ca"] --> A2["so�"]
    A3["bb 6d"] --> A4["�m"]
  end
  subgraph B["StringDecoder"]
    B1["73 6f ca"] --> B2["so<br/>ca — kutadi"]
    B3["bb 6d"] --> B4["ʻm<br/>ca bb birlashdi"]
  end

Ikki to'g'ri yo'l:

  • Buffer.concat — avval hamma baytni yig'ib, keyin bir marta o'qish. Oddiy, lekin butun ma'lumot xotirada.
  • StringDecoder — har bo'lakdan to'liq belgilarni chiqaradi, chala qolganini keyingi bo'lakkacha saqlaydi. Oqimlar uchun shu kerak. Brauzerdagi ekvivalenti: new TextDecoder().decode(chunk, { stream: true }).

Lotin harflari bilan sinaganda bu xato ko'rinmaydi — ular 1 bayt, hech qachon bo'linmaydi. O'zbekcha ʻ, kirill, emoji paydo bo'lganda — "ba'zan" buzilgan harflar chiqadi. Bunday "ba'zan"lik xatolarni topish qiyin. Stream'lar bilan ishlaganda Node buni setEncoding("utf8") orqali hal qiladi — ichida aynan StringDecoder (Stream nima). readline ham ichida shuni ishlatadi — shuning uchun u "lag'mon" ni to'g'ri yig'di.

6. Sonlar baytlarda

Binar formatlar (rasm, arxiv, tarmoq protokoli) sonlarni matn emas, baytlar sifatida saqlaydi. Buffer'da buning uchun write… / read… metodlari bor:

js
const header = Buffer.alloc(4);
header.writeUInt32BE(297); // 297 — 4 baytli butun son
console.log(header); // <Buffer 00 00 01 29>
console.log(header.readUInt32BE()); // 297

const rate = Buffer.alloc(8);
rate.writeDoubleLE(11903.15); // 8 baytli kasr son
console.log(rate.toString("hex")); // 33333333933fc740
console.log(rate.readDoubleLE()); // 11903.15

Nomlarda uchta ma'lumot bor. Birinchisi — son turi: UInt32 ishorasiz 32 bitli butun son (4 bayt). Ikkinchisi — Double: 64 bitli kasr son (8 bayt, JS'dagi number ning o'zi). Uchinchisi — BE/LE, ya'ni bayt tartibi (endianness). Big Endian — katta bayt oldin (00 00 01 29, odam o'qiydigan tartib, tarmoq protokollari). Little Endian — kichik bayt oldin (ko'p protsessorlar shunday saqlaydi).

net darsidagi uzunlik prefiksli protokolni eslang: haqiqiy protokollarda uzunlik "5:" matni emas, aynan shunday 4 baytli UInt32BE bo'ladi. Kanon misoli — writeDoubleLE(11903.15) → 33333333933fc740, dollar kursi 8 bayt.

7. CLI qadami: holat yo'q — Buffer ichkarida

valyuta Buffer'ni to'g'ridan yaratmaydi — unga binar format kerak emas: CBU JSON matn beradi, kesh — JSON fayl. Shuning uchun kanon bu darsda kod qo'shmadi va o'lchov bilan cheklandi (t29-buffer.txt). Lekin baytlar loyihaning bir necha joyida yashirin ishlaydi:

Joy Buffer qayerda
kalit.ts createHash(…).digest("hex") — 32 baytli hash hex satrga (keyin 16 belgisi olinadi)
fayl.ts randomBytes(4).toString("hex") — vaqtinchalik fayl nomi
interaktiv.test.ts chiqish.on("data", (b: Buffer) => …) — PassThrough bo'laklari
tarix.ts (holat 35) createGzip() — matn → siqilgan baytlar

E'tibor bering: testdagi matn += b.toString() — «Bo'lingan belgi» bo'limidagi usul! Testda bu xavfsiz, chunki PassThrough ga har safar butun satr yoziladi va u bo'linmaydi. Lekin haqiqiy tarmoq oqimida xuddi shu qator ko'p baytli belgili kurs nomlarini (CBU CcyNm_UZ maydoni — 4-mashqqa qarang) ba'zan buzishi mumkin. Bu darsda commit yo'q.

8. Ko'p uchraydigan xatolar

Belgi Sabab Davosi
Matnda � "ba'zan" chiqadi Bo'lak chegarasida ko'p baytli belgi StringDecoder, setEncoding("utf8") yoki concat
soʻm, ü kabi belgilar UTF-8 boshqa kodlash bilan o'qildi Ikkala tomonda ham utf8
Maydonga "sig'adi" deb hisoblandi, lekin kesildi length bilan hisob Buffer.byteLength
Bo'lakni o'zgartirdim — asl bufer ham o'zgardi subarray/slice — umumiy xotira Nusxa: Buffer.from(buf)
Tashqariga begona ma'lumot ketdi allocUnsafe to'liq to'ldirilmagan Buffer.alloc
DeprecationWarning: Buffer() is deprecated new Buffer(…) Buffer.from / Buffer.alloc
JWT tokenni URL'ga qo'yganda buzildi base64 dagi + / = base64url

9. Mashqlar

Mashqlar kurs/mashqlar/24/29-buffer/ da.

1-mashq (oson): hisoblang

  • Buffer.byteLength("salom") —
  • Buffer.byteLength("so'm") —
  • "soʻm" necha bayt —
  • Buffer.from("A").toString("hex") —
  • URL uchun xavfsiz base64 nomi —
Yechim
  • 5 — lotin harflari 1 baytdan.
  • 4 — oddiy apostrof ham 1 bayt.
  • 5 — ʻ 2 bayt (ca bb).
  • 41 — "A" = 65 = 0x41.
  • base64url — - _, = siz.

2-mashq (o'rta): SMS bo'laklari

SMS bitta xabarga 140 bayt sig'adi. smsParts(text) funksiyasini yozing: matnni UTF-8 baytlari 140 dan oshmaydigan bo'laklarga ajratsin va belgini o'rtasidan bo'lmasin. Maslahat: belgilar bo'yicha aylanib (for (const ch of text)), har belgining Buffer.byteLength ini qo'shib boring. Sinang: 100 ta "a" + 30 ta "ʻ" ("ʻ") + 20 ta "b".

Yechim
js
function smsParts(text, limit = 140) {
  const parts = [];
  let current = "";
  let size = 0;
  for (const ch of text) {
    const bytes = Buffer.byteLength(ch);
    if (size + bytes > limit) {
      parts.push(current);
      current = "";
      size = 0;
    }
    current += ch;
    size += bytes;
  }
  if (current) parts.push(current);
  return parts;
}

const text = "a".repeat(100) + "\u02BB".repeat(30) + "b".repeat(20);
const parts = smsParts(text);
console.log(parts.length);
console.log(parts.map((p) => Buffer.byteLength(p)));
console.log(parts.map((p) => [...p].length));

Konsolda:

text
2
[ 140, 40 ]
[ 120, 30 ]

Matn 150 belgi, lekin 180 bayt. Birinchi SMS — 100 ta "a" (100 bayt) + 20 ta ʻ (40 bayt) = 140 bayt, 120 belgi. Qolgan 10 ta ʻ va 20 ta "b" — ikkinchi bo'lak. Agar baytlar bo'yicha subarray(0, 140) qilsak, ʻ o'rtasidan bo'linishi mumkin edi.

3-mashq (qiyin): xabar paketi

Binar paket formati: 4 bayt — xabar uzunligi (UInt32BE), keyin xabarning UTF-8 baytlari. pack(text) va unpack(buf) yozing. unpack bir nechta paket ketma-ket turgan buferdan hamma xabarlarni qaytarsin. Sinang: "osh", "soʻm", "" — uchalasini Buffer.concat bilan birlashtirib, keyin unpack.

Yechim
js
function pack(text) {
  const body = Buffer.from(text, "utf8");
  const header = Buffer.alloc(4);
  header.writeUInt32BE(body.length);
  return Buffer.concat([header, body]);
}

function unpack(buf) {
  const messages = [];
  let offset = 0;
  while (offset + 4 <= buf.length) {
    const length = buf.readUInt32BE(offset);
    const start = offset + 4;
    const body = buf.subarray(start, start + length);
    messages.push(body.toString("utf8"));
    offset = start + length;
  }
  return messages;
}

const packets = ["osh", "so\u02BBm", ""].map(pack);
const stream = Buffer.concat(packets);
console.log(stream.length);
console.log(packets[1]);
console.log(unpack(stream));

Konsolda:

text
20
<Buffer 00 00 00 05 73 6f ca bb 6d>
[ 'osh', 'soʻm', '' ]

Jami 20 bayt: uchta sarlavha (12) + 3 + 5 + 0. Ikkinchi paketda uzunlik 00 00 00 05 — 5 bayt, 4 belgi emas. Agar sarlavhaga text.length (4) yozsak, unpack ʻ ni yarmidan kesardi va keyingi paket ham surilib, hammasi buzilardi.

4-mashq: CLI qadami — kurs nomlarining baytlari

valyuta ning fixtures/kurslar-2026-10-23.json faylidagi har valyutaning CcyNm_UZ (o'zbekcha nomi) maydoni uchun belgi va bayt sonini hisoblang. Qaysi nomlarda bayt soni belgi sonidan katta? Ichida ʻ (U+02BB) bormi yoki oddiy '? Kichik skript yozing (loyihaga qo'shmang).

Yechim
js
import { readFile } from "node:fs/promises";

const file = "fixtures/kurslar-2026-10-23.json";
const list = JSON.parse(await readFile(file, "utf8"));
for (const { Ccy, CcyNm_UZ } of list) {
  const chars = [...CcyNm_UZ].length;
  const bytes = Buffer.byteLength(CcyNm_UZ);
  if (bytes > chars) console.log(Ccy, chars, bytes, CcyNm_UZ);
}

Biz kanon fixture'ida ishga tushirdik (74 valyuta, Node 24.21.0):

text
AFN 21 25 Afg‘oniston afg‘onisi
KGS 12 14 Qirg‘iz somi
KZT 19 21 Qozog‘iston tengesi
SAR 24 26 Saudiya Arabistoni riali

Kutilmagan topilma: CBU o'zbekcha nomlarda na ', na ʻ ishlatadi — balki uchinchi belgini, ‘ (U+2018, "chap bittalik qo'shtirnoq") ni. U UTF-8 da 3 bayt (e2 80 98): "Afg‘oniston afg‘onisi" — 21 belgi, 25 bayt. SAR nomida esa ko'rinmas belgi bor — ikkita uzilmas bo'shliq (U+00A0, 2 baytdan), ko'zga oddiy bo'shliqdek. Amaliy natija: foydalanuvchi valyuta da "qirg'iz" deb qidirsa, oddiy includes uni topmaydi — avval belgilarni bir xil ko'rinishga keltirish kerak. Jadval kengligi (padEnd) esa belgilar bo'yicha hisoblanadi — baytlar bilan adashtirmang.

10. Real ishda

  • Fayl yuklash — rasm, PDF serverga baytlar bo'lib keladi; ularni Buffer yoki oqim sifatida qayta ishlash backend qismlarida.
  • Tokenlar — JWT uch qismi base64url; Buffer.from(qism, "base64url") bilan ichini o'qish mumkin (auth qismida).
  • Kriptografiya — hash, HMAC, kalitlar — hammasi Buffer; solishtirish crypto.timingSafeEqual(bufA, bufB) bilan.
  • Kodlash muammolari — Excel'dan kelgan CSV (ko'pincha windows-1251 yoki BOM bilan), eski 1C eksportlari — "buzilgan harflar" shikoyatining asosiy manbai.
  • Intervyuda: "length va byteLength farqi?", "subarray nusxa oladimi?", "base64 hajmni qanchaga oshiradi?".

Xulosa

  • Buffer — baytlar massivi (Uint8Array asosida); Buffer.from(satr) UTF-8 bilan kodlaydi.
  • alloc — xavfsiz (nollar), allocUnsafe — eski qoldiq bo'lishi mumkin; new Buffer — eskirgan.
  • Kodlashlar: utf8, hex, base64 (+33 %), base64url (URL/JWT), latin1; o'qish va yozish kodlashi bir xil bo'lsin.
  • length ≠ byteLength: ' — 1 bayt, ʻ — 2, — — 3, emoji — 4; joy baytda o'lchanadi.
  • Bo'lak chegarasidagi ko'p baytli belgi toString da buziladi — StringDecoder, setEncoding yoki Buffer.concat.

Keyingi dars: Stream nima: to'rt turi va rejimlari — Buffer bo'laklari oqib keladigan quvurlar: Readable, Writable, Duplex, Transform.

Manbalar

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
Node.js Buffer: baytlar, UTF-8, base64, hex va binar ma'lumot — IlmHamroh