Buferis yra konkreti vieta neapdorotoje atmintyje. Jis naudojamas kaip laikina saugojimo vieta dvejetainiams duomenims, kurių apdorojimo įrenginys negali priimti tuo konkrečiu momentu.
Node.js apima buferio klasę. Jis gali tvarkyti dvejetainius duomenis, kai tvarko TCP (Transfer Control Protocol) srautus ir failų sistemos skaitymo-rašymo operacijas.
Sužinokite, kaip kurti, skaityti ir keisti buferio turinį.
Buferio kūrimas
Norėdami sukurti buferį Node.js, naudosite alloc () arba iš () metodus. The alloc () metodas sukuria naują buferį, kurimo metu nurodydamas jo dydį kaip pirmąjį ir vienintelį reikalingą parametrą. Tai naudinga, kai buferio kūrimo metu neturite saugoti duomenų.
Nurodykite buferio dydžio parametrą baitais kurdami buferį naudodami alloc () metodas. Pavyzdžiui:
konst buf = Buferis.alloc(8);
konsolė.log (buf);
// išvestis:
Buferio klasė automatiškai prideda nulius kaip vietos rezervavimo reikšmes naujiems duomenims, kai sukuriate juos naudodami
alloc () metodas.Buferio klasė kiekvieną 0 reikšmę išreiškia kaip 00, naudojant šešioliktainį formatą. Šiame pavyzdyje iš viso yra aštuonios vertės.
Norėdami inicijuoti buferį su skirtingomis rezervuotos vietos reikšmėmis, perduokite sekundę užpildyti parametras:
konst buf_filled = Buferis.alloc(8, 5);
konsolė.log (buf_filled);
// išvestis:
Šis objektas nurodo atminties dalį, kurioje saugomi 8 vertės baitai 05. Atminkite, kad nors numerį perdavėte kaip užpildyti parametras, buferiai duomenis saugo tik dvejetainiu formatu.
Paskyrę atmintį buferiui, rašykite duomenis skambindami rašyti () metodas:
konst buf = Buferis.alloc(8);
buf.write("v", "utf-8");
konsolė.log (buf)
// išvestis:
buf.write("va","utf-8");
konsolė.log (buf)
// išvestis:
The rašyti () metodas naudoja simbolių kodavimą, kad konvertuotų pirmąjį parametrą, naudojant utf-8 ir tada įrašo eilutę į buferį. Įtraukus į eilutę antrą simbolį, antrasis baitas bus užpildytas.
Norėdami išgauti duomenis iš esamų duomenų tipų, pvz., eilučių ar masyvų, naudokite iš () metodas. Šis metodas sukuria buferius iš eilučių ir masyvų.
Pavyzdžiui:
// Styga
konst stringBuf = Buferis.from("styga")
konsolė.log (stringBuf)
// išvestis:
// Masyvas
konst arrayBuf = Buferis.from([97, 114, 114, 97, 121], 'hex')
konsolė.log (arrayBuf);
// išvestis:
The iš () metodas priima įvestį kaip pirmąjį parametrą, apskaičiuoja baitų skaičių, kurio reikia duomenims užkoduoti, ir tada siunčia rezultatą į buferį. Kaip antrąjį parametrą pateikę kitą kodavimo formatą, galite nepaisyti numatytosios kodavimo (UTF-8).
Skaičių perdavimas į iš () metodas sukels klaidą.
Buferio skaitymas
Nors buferiai yra panašūs į masyvus, jų dydis negali būti keičiamas ir gali būti naudojamas dvejetainiai kompiuterio duomenys integruotų metodų dėka.
Buferio klasė leidžia nuskaityti atskirus jos duomenų baitus naudojant „JavaScript“ laužtinių skliaustų sintaksę.
Pavyzdžiui:
konst myBuf = Buferis.from("Mano");
konsolė.log(MyBuf[1]);
// išvestis: 105konsolė.log(MyBuf[3]);
// išvestis: 101
konsolė.log(MyBuf[5]);
// išvestis: neapibrėžta
Aukščiau pateiktame kodo bloke naudojama laužtinių skliaustų sintaksė, kad gautų pirmojo ir trečiojo baitų reikšmes jų dešimtainėje pavaizdacijoje. Bandant gauti neteisingą baitą, bus rodomas neapibrėžtas klaida.
Norėdami pasiekti visus savo duomenis, buferio klasėje yra metodai į JSON() ir toString(), kurios turinį gauna dviem skirtingais formatais.
The toString() metodas išveda eilutę kaip buferio turinį:
konst myBuf = Buferis.from("Mano");
konsolė.log(myBuf.toString());
// išvestis: „Mano“konst numberBuf = Buferis.from([123]);
konsolė.log(numerisBuf.toString())
// išvestis: '{'
konst emptyBuf = Buferis.alloc(5);
konsolė.log(tuščiasBuf.toString());
// išvestis: '\\x00\\x00\\x00\\x00\\x00'
Pirmasis skambutis inicijuoja buferį su reikšme "Mano“, kurį atkartoja iškvietimas į toString. Antrame pavyzdyje inicijavimui naudojamas vieno int masyvas, kurio eilutės atvaizdavimas yra „{" charakteris. Galutiniu atveju buferis su penkiais nulinės reikšmės grąžina eilutę "\x00\x00\x00\x00\x00”. Styga \x00 yra šešioliktainis nulio atvaizdavimas.
The toString() metodas visada išveda rezultatą eilutės formatu, nesvarbu, su kokio tipo duomenimis inicijuojate buferį.
The .toJSON() metodas grąžina buferio duomenų dešimtainį vaizdą, neatsižvelgiant į duomenis, kuriuos naudojote inicijuodami buferį.
Pavyzdžiui:
konst myBuf = Buferis.from("Mano");
konsolė.log(myBuf.toJSON());
// išvestis: { tipo: "Buferis", duomenys: [ 77, 105, 110, 101 ] }
JSON išvestis turi a tipo turtas, kurio vertė Buferis nurodyti jo kilmę. Jo duomenų savybėje saugomas dešimtainių skaičių masyvas, atspindintis pradinį baitų masyvą.
Buferio modifikavimas
Panašiai kaip ir prieiga prie atskirų buferio baitų, taip pat galite keisti atskirus buferio turinio baitus naudodami laužtinių skliaustų sintaksę.
Kai naudojate laužtinių skliaustų sintaksę atskiram turiniui pakeisti, galite priskirti tik dešimtainį reikšmės atvaizdavimą.
Pavyzdžiui:
myBuf[0] = 70
konsolė.log(myBuf.toString())
// išvestis: 'gerai'
Kadangi buferiai yra dvejetainiai duomenys, negalite suteikti konkrečios buferio dalies eilutės. Jei bandysite nustatyti atskirą baitą į eilutę, buferis pavers jį nuliniu simboliu.
Pavyzdžiui:
myBuf[0] = "F";
konsolė.log(myBuf.toString());
// išvestis: '\\x00ine'
Arba galite pakeisti visą buferio turinį naudodami rašyti () metodas.
Apsvarstykite galimybę įterpti indeksą už buferio ilgio. Užuot grąžinęs klaidą, buferis nepaiso netinkamo indekso ir išsaugo originalų buferio turinį.
Pavyzdžiui, pabandykite nustatyti penktąjį elementą myBuf į r per savo dešimtainį atvaizdavimą 114:
myBuf[4] = 114;
konsolė.log(myBuf.toString());
// išvestis: „Mano“
Atkreipkite dėmesį, kad toString() metodas grąžina tą pačią reikšmę "Mano".
Kadangi negalite pakeisti buferio dydžio, bandant įrašyti daugiau duomenų, nei telpa, papildomi duomenys bus atmesti. Pavyzdžiui:
konst buf1 = Buferis.alloc(5)
buf1.write("skaičius");
konsolė.log(buf1.toString())
// išvestis: 'numbe'
Naudojant toString() būdas patvirtinti buferio duomenis, jis grįžta 'numeris' geriau nei „skaičius“. Kuris yra įterptas argumentas viduje rašyti () metodas.
Buferiai rašo serijiniu būdu, pradedant nuo nulio. The rašyti () metodas nuosekliai prideda baitus prie buferio, perrašydamas visus ankstesnius duomenis.
Pavyzdžiui:
konst buf2 = Buferis.alloc(6);
buf2.write('narys');
konsolė.log(buf2.toString())
// išvestis: 'nary'
buf2.write('labas');
konsolė.log(buf2.toString());
// išvestis: 'himber'
Aukščiau pateiktas kodas sukuria šešių baitų buferį ir prideda eilutę "narys“ prie jo naudojant rašyti () metodas.
Tada jis atnaujina buferį nauju turiniu, kuris užima mažiau vietos atmintyje nei ankstesnis turinys.
Dėl to sukuriama nauja eilutė, kurios pirmieji du baitai yra perrašyti, o likę baitai paliekami nepakeisti.
Daugelis API ir duomenų struktūrų naudoja buferius
Dabar žinote, kaip sukurti buferį, įrašyti į jį, perskaityti jo turinį ir modifikuoti jį atitinkamais metodais.
Yra keletas kitų būdų, kaip dirbti su Node.js buferio klase.
Turėtumėte žinoti šiuos metodus ir suprasti buferius, kad suprastumėte, kaip veikia įvairios sąvokos, pvz., srautai ir failų sistemos.