Læsere som dig hjælper med at støtte MUO. Når du foretager et køb ved hjælp af links på vores websted, kan vi optjene en affiliate-kommission. Læs mere.

En buffer er en bestemt placering i rå hukommelse. Det tjener som et midlertidigt lagerplads for overskydende binære data, som behandlingsenheden ikke kan acceptere på det bestemte tidspunkt.

Node.js inkluderer en bufferklasse. Den kan håndtere binære data, når den administrerer TCP-streams (Transfer Control Protocol) og læse-skrive-operationer på et filsystem.

Lær, hvordan du opretter, læser og ændrer indholdet af en buffer.

Oprettelse af en buffer

For at oprette en buffer i Node.js skal du bruge alloc() eller fra() metoder. Det alloc() metoden opretter en ny buffer, der angiver dens størrelse under oprettelsen som den første og eneste nødvendige parameter. Det er nyttigt, når du ikke har nogen data at gemme på tidspunktet for oprettelse af buffer.

Angiv bufferstørrelsesparameteren i bytes, når du opretter en buffer med alloc() metode. For eksempel:

instagram viewer
konst buf = Buffer.alloc(8);
konsol.log (buff);
// output:

Buffer-klassen tilføjer automatisk nuller som pladsholderværdier for nye data, når du opretter dem med alloc() metode.

Buffer-klassen udtrykker hver 0-værdi som 00, ved hjælp af hexadecimalt format. I dette eksempel indeholder den i alt otte værdier.

For at initialisere bufferen med forskellige pladsholderværdier skal du gå et sekund fylde parameter:

konst buff_filled = Buffer.alloc(8, 5);
konsol.log (buff_filled);
// output:

Dette objekt citerer en del i hukommelsen, der gemmer 8 bytes af værdien 05. Bemærk, at selvom du har bestået et nummer som fylde parameter, buffere gemmer kun data i binær.

Efter at have allokeret hukommelse til bufferen, skriv data ved at kalde skrive() metode:

konst buf = Buffer.alloc(8);

buf.write("v", "utf-8");
konsol.log (buff)
// output:

buf.write("va","utf-8");
konsol.log (buff)
// output:

Det skrive() metode bruger tegnkodning til at konvertere den første parameter ved hjælp af utf-8 og skriver derefter strengen til bufferen. Tilføjelse af et andet tegn til strengen vil fylde den anden byte.

For at udtrække data fra eksisterende datatyper som strenge eller arrays, skal du bruge fra() metode. Denne metode opretter buffere fra strenge og arrays.

For eksempel:

// String
konst stringBuf = Buffer.fra('snor')
konsol.log (stringBuf)
// output:

// Array
konst arrayBuf = Buffer.fra([97, 114, 114, 97, 121], 'hex')
konsol.log (arrayBuf);
// output:

Det fra() metoden tager input som sin første parameter, beregner det antal bytes, den skal bruge for at kode dataene, og sender derefter resultatet til bufferen. Ved at angive et andet kodningsformat som den anden parameter, kan du tilsidesætte standardkodningen (UTF-8).

Videregivelse af numre til fra() metode vil resultere i en fejl.

Læsning af en buffer

Selvom buffere ligner arrays, kan de ikke ændres størrelse og kan håndteres binære computerdata takket være indbyggede metoder.

Buffer-klassen giver os mulighed for at læse individuelle bytes af dens data ved hjælp af JavaScripts firkantede parentes-syntaks.

For eksempel:

konst myBuf = Buffer.fra('Mine');
konsol.log(MyBuf[1]);
// output: 105

konsol.log(MyBuf[3]);
// output: 101

konsol.log(MyBuf[5]);
// output: udefineret

Kodeblokken ovenfor anvender den firkantede parentes syntaks til at opnå værdierne af den første og tredje byte i deres decimalrepræsentation. Forsøg på at få en ugyldig byte vil resultere i en udefineret fejl.

For at få adgang til alle dens data kommer Buffer-klassen med metoder tilJSON() og toString(), som henter indholdet i to forskellige formater.

Det toString() metoden udsender en streng som bufferindholdet:

konst myBuf = Buffer.fra('Mine');
konsol.log(minBuf.toString());
// output: 'Min'

konst nummerBuf = Buffer.fra([123]);
konsol.log(nummerBuf.toString())
// output: '{'

konst emptyBuf = Buffer.alloc(5);
konsol.log(tommeBuf.toString());
// output: '\\x00\\x00\\x00\\x00\\x00'

Det første opkald initialiserer bufferen med værdien "Mine”, som opkaldet til toString replikerer. Det andet eksempel bruger et enkelt-int-array til initialisering, som har en strengrepræsentation som "{" Karakter. I det sidste tilfælde en buffer med fem null-værdier returnerer strengen "\x00\x00\x00\x00\x00”. Snoren \x00 er den hexadecimale repræsentation af nul.

Det toString() metoden udsender altid resultatet i strengformat, uanset hvilken type data du initialiserer bufferen med.

Det .toJSON() metoden returnerer decimalrepræsentationen af ​​bufferdataene, uanset de data du brugte til at initialisere bufferen.

For eksempel:

konst myBuf = Buffer.fra('Mine');
konsol.log(minBuf.toJSON());
// output: { type: 'Buffer', data: [ 77, 105, 110, 101 ] }

JSON-outputtet har en type ejendom med en værdi på Buffer for at angive dens oprindelse. Dens dataegenskab gemmer et array af decimaler, der repræsenterer den oprindelige byte-array.

Ændring af en buffer

I lighed med at få adgang til de individuelle bytes af en buffer, kan du også ændre individuelle bytes af en buffers indhold ved at bruge den firkantede parentes syntaks.

Når du bruger den firkantede parentes syntaks til at ændre et individuelt indhold, kan du kun tildele decimalrepræsentationen af ​​værdien.

For eksempel:

myBuf[0] = 70
konsol.log(minBuf.toString())
// output: 'Fin'

Fordi buffere er binære data, kan du ikke give en specifik del af en buffer en streng. Hvis du forsøger at sætte en individuel byte til en streng, vil Buffer oversætte den til et nul-tegn.

For eksempel:

minBuf[0] = 'F';
konsol.log(minBuf.toString());
// output: '\\x00ine'

Alternativt kan du ændre hele indholdet af en buffer ved hjælp af skrive() metode.

Overvej at indsætte et indeks uden for bufferens længde. I stedet for at returnere en fejl ignorerer Buffer det ugyldige indeks og holder det originale Bufferindhold intakt.

Prøv for eksempel at indstille det femte element af minBuf til r via sin decimalrepræsentation af 114:

myBuf[4] = 114;
konsol.log(minBuf.toString());
// output: 'Min'

Bemærk, at toString() metode returnerer den samme værdi 'Mine'.

Da du ikke kan ændre størrelsen på en buffer, vil forsøg på at skrive flere data, end man kan holde, resultere i, at de ekstra data kasseres. For eksempel:

konst buf1 = Buffer.alloc(5)
buf1.write('nummer');
konsol.log(buf1.toString())
// output: 'numbe'

Bruger toString() metode til at bekræfte bufferdataene, vender den tilbage 'numbe' hellere end 'nummer'. Hvilket er det indsatte argument inde i skrive() metode.

Buffere skriver på en seriel måde, der begynder ved indeks nul. Det skrive() metode tilføjer seriel bytes til en buffer, og overskriver tidligere data.

For eksempel:

konst buf2 = Buffer.alloc(6);

buf2.write('medlem');
konsol.log(buf2.toString())
// output: 'medlem'

buf2.write('Hej');
konsol.log(buf2.toString());
// output: 'himber'

Koden ovenfor opretter en seks-byte buffer og tilføjer strengen "medlem" til det ved hjælp af skrive() metode.

Den opdaterer derefter bufferen med nyt indhold, der fylder mindre i hukommelsen end det tidligere indhold.

Dette resulterer i oprettelsen af ​​en ny streng med de første to bytes overskrevet og de resterende bytes uændrede.

Mange API'er og datastrukturer bruger buffere

Nu ved du, hvordan du opretter en buffer, skriver til en, læser dens indhold og ændrer den med de relevante metoder.

Der er flere andre tilgængelige metoder til at arbejde med Node.js Buffer-klassen.

Du bør kende disse metoder og forstå buffere for at forstå, hvordan forskellige koncepter som streams og filsystemer fungerer.