Ένα buffer είναι μια συγκεκριμένη θέση στην ακατέργαστη μνήμη. Χρησιμεύει ως προσωρινός χώρος αποθήκευσης για υπερβολικά δυαδικά δεδομένα που η μονάδα επεξεργασίας δεν μπορεί να δεχθεί τη συγκεκριμένη στιγμή.
Το Node.js περιλαμβάνει μια κλάση Buffer. Μπορεί να αντιμετωπίσει δυαδικά δεδομένα κατά τη διαχείριση ροών TCP (Transfer Control Protocol) και λειτουργίες ανάγνωσης-εγγραφής σε ένα σύστημα αρχείων.
Μάθετε πώς να δημιουργείτε, να διαβάζετε και να αλλάζετε τα περιεχόμενα ενός buffer.
Δημιουργία buffer
Για να δημιουργήσετε ένα buffer στο Node.js, θα χρησιμοποιήσετε το κατανομή () ή από() μεθόδους. ο κατανομή () μέθοδος δημιουργεί ένα νέο buffer, προσδιορίζοντας το μέγεθός του κατά τη δημιουργία ως την πρώτη και μοναδική απαιτούμενη παράμετρο. Είναι χρήσιμο όταν δεν έχετε δεδομένα για αποθήκευση τη στιγμή της δημιουργίας buffer.
Καθορίστε την παράμετρο μεγέθους buffer σε byte όταν δημιουργείτε ένα buffer με το κατανομή () μέθοδος. Για παράδειγμα:
συνθ buf = Buffer.alloc(8);
κονσόλα.log (buf);
// έξοδος:
Η κλάση buffer προσθέτει αυτόματα μηδενικά ως τιμές κράτησης θέσης για νέα δεδομένα όταν τα δημιουργείτε με το κατανομή () μέθοδος.
Η κλάση buffer εκφράζει κάθε τιμή 0 ως 00, χρησιμοποιώντας δεκαεξαδική μορφή. Σε αυτό το παράδειγμα, περιέχει συνολικά οκτώ τιμές.
Για να αρχικοποιήσετε το buffer με διαφορετικές τιμές κράτησης θέσης, περάστε ένα δευτερόλεπτο γέμισμα παράμετρος:
συνθ buf_filled = Buffer.alloc(8, 5);
κονσόλα.log (buf_filled);
// έξοδος:
Αυτό το αντικείμενο αναφέρει ένα τμήμα στη μνήμη που αποθηκεύει 8 byte της τιμής 05. Σημειώστε ότι παρόλο που περάσατε έναν αριθμό ως το γέμισμα παράμετρος, τα buffer αποθηκεύουν δεδομένα μόνο σε δυαδικό.
Αφού εκχωρήσετε μνήμη στο Buffer, γράψτε δεδομένα καλώντας το γράφω() μέθοδος:
συνθ buf = Buffer.alloc(8);
buf.write("v", "utf-8");
κονσόλα.log (buf)
// έξοδος:
buf.write("va","utf-8");
κονσόλα.log (buf)
// έξοδος:
ο γράφω() Η μέθοδος χρησιμοποιεί κωδικοποίηση χαρακτήρων για τη μετατροπή της πρώτης παραμέτρου, χρησιμοποιώντας utf-8 και στη συνέχεια γράφει τη συμβολοσειρά στο buffer. Η προσθήκη ενός δεύτερου χαρακτήρα στη συμβολοσειρά θα γεμίσει το δεύτερο byte.
Για να εξαγάγετε δεδομένα από υπάρχοντες τύπους δεδομένων, όπως συμβολοσειρές ή πίνακες, χρησιμοποιήστε το από() μέθοδος. Αυτή η μέθοδος δημιουργεί buffers από συμβολοσειρές και πίνακες.
Για παράδειγμα:
// Χορδή
συνθ stringBuf = Buffer.from('σειρά')
κονσόλα.log (stringBuf)
// έξοδος:
// Πίνακας
συνθ arrayBuf = Buffer.from([97, 114, 114, 97, 121], 'γοητεύω')
κονσόλα.log (arrayBuf);
// έξοδος:
ο από() Η μέθοδος παίρνει την είσοδο ως την πρώτη της παράμετρο, υπολογίζει τον αριθμό των byte που χρειάζεται για να κωδικοποιήσει τα δεδομένα και, στη συνέχεια, στέλνει το αποτέλεσμα στο Buffer. Παρέχοντας μια άλλη μορφή κωδικοποίησης ως δεύτερη παράμετρο, μπορείτε να παρακάμψετε την προεπιλεγμένη κωδικοποίηση (UTF-8).
Περνώντας αριθμούς στο από() μέθοδος θα οδηγήσει σε σφάλμα.
Διαβάζοντας ένα buffer
Αν και τα buffer είναι παρόμοια με τους πίνακες, δεν μπορούν να αλλάξουν μέγεθος και μπορούν να τα αντιμετωπίσουν δυαδικά δεδομένα υπολογιστή χάρη στις ενσωματωμένες μεθόδους.
Η κλάση Buffer μας επιτρέπει να διαβάζουμε μεμονωμένα byte των δεδομένων της χρησιμοποιώντας τη σύνταξη τετραγωνικής αγκύλης της JavaScript.
Για παράδειγμα:
συνθ myBuf = Buffer.from('Δικος μου');
κονσόλα.κούτσουρο(MyBuf[1]);
// έξοδος: 105κονσόλα.κούτσουρο(MyBuf[3]);
// έξοδος: 101
κονσόλα.κούτσουρο(MyBuf[5]);
// έξοδος: απροσδιόριστος
Το παραπάνω μπλοκ κώδικα χρησιμοποιεί τη σύνταξη της αγκύλας για να λάβει τις τιμές του πρώτου και του τρίτου byte στη δεκαδική τους αναπαράσταση. Η προσπάθεια λήψης μη έγκυρου byte θα έχει ως αποτέλεσμα ένα απροσδιόριστος λάθος.
Για πρόσβαση σε όλα τα δεδομένα της, η κλάση Buffer συνοδεύεται από μεθόδους toJSON() και toString(), τα οποία λαμβάνουν τα περιεχόμενα σε δύο διαφορετικές μορφές.
ο toString() Η μέθοδος εξάγει μια συμβολοσειρά ως περιεχόμενα buffer:
συνθ myBuf = Buffer.from('Δικος μου');
κονσόλα.κούτσουρο(myBuf.toString());
// έξοδος: 'Δικό μου'συνθ numberBuf = Buffer.from([123]);
κονσόλα.κούτσουρο(αριθμόςBuf.toString())
// έξοδος: '{'
συνθ valaBuf = Buffer.alloc(5);
κονσόλα.κούτσουρο(κενόBuf.toString());
// έξοδος: '\\x00\\x00\\x00\\x00\\x00'
Η πρώτη κλήση αρχικοποιεί το buffer με την τιμή "Δικος μου”, το οποίο αναπαράγει η κλήση στο toString. Το δεύτερο παράδειγμα χρησιμοποιεί έναν πίνακα single-int για προετοιμασία, ο οποίος έχει μια παράσταση συμβολοσειράς ως "{” χαρακτήρας. Στην τελική περίπτωση, ένα Buffer με πέντε μηδενικές τιμές επιστρέφει τη συμβολοσειρά "\x00\x00\x00\x00\x00”. Η χορδή \x00 είναι η δεκαεξαδική αναπαράσταση του null.
ο toString() Η μέθοδος εξάγει πάντα το αποτέλεσμα σε μορφή συμβολοσειράς, ανεξάρτητα από τον τύπο δεδομένων με τον οποίο αρχικοποιείτε το buffer.
ο .toJSON() Η μέθοδος επιστρέφει τη δεκαδική αναπαράσταση των δεδομένων buffer, ανεξάρτητα από τα δεδομένα που χρησιμοποιήσατε για την προετοιμασία του buffer.
Για παράδειγμα:
συνθ myBuf = Buffer.from('Δικος μου');
κονσόλα.κούτσουρο(myBuf.toJSON());
// έξοδος: { τύπος: 'Ρυθμιστής', δεδομένα: [ 77, 105, 110, 101 ] }
Η έξοδος JSON έχει ένα τύπος ακίνητο με αξία Ρυθμιστής για να δηλώσει την προέλευσή του. Η ιδιότητα δεδομένων του αποθηκεύει έναν πίνακα δεκαδικών που αντιπροσωπεύουν τον αρχικό πίνακα byte.
Τροποποίηση buffer
Παρόμοια με την πρόσβαση στα μεμονωμένα byte ενός buffer, θα μπορούσατε επίσης να τροποποιήσετε μεμονωμένα byte του περιεχομένου ενός buffer χρησιμοποιώντας τη σύνταξη αγκύλων.
Όταν χρησιμοποιείτε τη σύνταξη αγκύλων για να αλλάξετε ένα μεμονωμένο περιεχόμενο, μπορείτε να εκχωρήσετε μόνο τη δεκαδική αναπαράσταση της τιμής.
Για παράδειγμα:
myBuf[0] = 70
κονσόλα.κούτσουρο(myBuf.toString())
// έξοδος: 'Ωραία'
Επειδή τα buffer είναι δυαδικά δεδομένα, δεν μπορείτε να δώσετε σε ένα συγκεκριμένο τμήμα ενός buffer μια συμβολοσειρά. Εάν προσπαθήσετε να ορίσετε ένα μεμονωμένο byte σε μια συμβολοσειρά, το Buffer θα το μεταφράσει σε έναν μηδενικό χαρακτήρα.
Για παράδειγμα:
myBuf[0] = 'ΦΑ';
κονσόλα.κούτσουρο(myBuf.toString());
// έξοδος: '\\x00ine'
Εναλλακτικά, μπορείτε να αλλάξετε ολόκληρο το περιεχόμενο ενός buffer χρησιμοποιώντας το γράφω() μέθοδος.
Εξετάστε το ενδεχόμενο εισαγωγής ενός ευρετηρίου εκτός του μήκους του buffer. Αντί να επιστρέψει ένα σφάλμα, το Buffer αγνοεί το μη έγκυρο ευρετήριο και διατηρεί ανέπαφο το αρχικό περιεχόμενο του buffer.
Για παράδειγμα, προσπαθήστε να ορίσετε το πέμπτο στοιχείο του myBuf προς την r μέσω της δεκαδικής αναπαράστασής του 114:
myBuf[4] = 114;
κονσόλα.κούτσουρο(myBuf.toString());
// έξοδος: 'Δικό μου'
Παρατηρήστε ότι το toString() μέθοδος επιστρέφει την ίδια τιμή 'Δικος μου'.
Εφόσον δεν μπορείτε να αλλάξετε το μέγεθος ενός buffer, η προσπάθεια εγγραφής περισσότερων δεδομένων από αυτά που μπορεί να κρατήσει κάποιος θα έχει ως αποτέλεσμα την απόρριψη των επιπλέον δεδομένων. Για παράδειγμα:
συνθ buf1 = Buffer.alloc(5)
buf1.write('αριθμός');
κονσόλα.κούτσουρο(buf1.toString())
// έξοδος: 'numbe'
Χρησιμοποιώντας την toString() μέθοδος επιβεβαίωσης των δεδομένων buffer, επιστρέφει "αριθμός" προκειμένου 'αριθμός'. Ποιο είναι το όρισμα που εισάγεται μέσα στο γράφω() μέθοδος.
Τα buffer γράφουν με σειριακό τρόπο που ξεκινά από το μηδέν δείκτη. ο γράφω() Η μέθοδος προσθέτει σειριακά byte σε ένα buffer, αντικαθιστώντας τυχόν προηγούμενα δεδομένα.
Για παράδειγμα:
συνθ buf2 = Buffer.alloc(6);
buf2.write('μέλος');
κονσόλα.κούτσουρο(buf2.toString())
// έξοδος: 'μέλος'
buf2.write('γεια');
κονσόλα.κούτσουρο(buf2.toString());
// έξοδος: 'himber'
Ο παραπάνω κώδικας δημιουργεί ένα buffer έξι byte και προσθέτει τη συμβολοσειρά "μέλος" σε αυτό χρησιμοποιώντας το γράφω() μέθοδος.
Στη συνέχεια, ενημερώνει το buffer με νέο περιεχόμενο που καταλαμβάνει λιγότερο χώρο στη μνήμη από το προηγούμενο περιεχόμενο.
Αυτό έχει ως αποτέλεσμα τη δημιουργία μιας νέας συμβολοσειράς με τα δύο πρώτα byte να αντικαθίστανται και τα υπόλοιπα byte να παραμένουν αναλλοίωτα.
Πολλά API και δομές δεδομένων χρησιμοποιούν buffer
Τώρα ξέρετε πώς να δημιουργήσετε ένα buffer, να γράψετε σε ένα, να διαβάσετε τα περιεχόμενά του και να το τροποποιήσετε με τις κατάλληλες μεθόδους.
Υπάρχουν πολλές άλλες διαθέσιμες μέθοδοι για εργασία με την κλάση Buffer Node.js.
Θα πρέπει να γνωρίζετε αυτές τις μεθόδους και να κατανοείτε τα Buffers για να κατανοήσετε πώς λειτουργούν διαφορετικές έννοιες όπως ροές και συστήματα αρχείων.