ホームページ  >  記事  >  ウェブフロントエンド  >  バッファーとは何ですか? Nodejs のバッファー モジュールの詳細については、こちらをご覧ください。

バッファーとは何ですか? Nodejs のバッファー モジュールの詳細については、こちらをご覧ください。

青灯夜游
青灯夜游転載
2021-12-30 19:21:162985ブラウズ

バッファとは何ですか?次の記事では、Nodejs のバッファー モジュールを深く理解し、バッファーの作成、コピー、スプライシング、インターセプト、バッファーへの充填、およびバッファーと文字列の変換の方法を紹介します。みんなの役に立ちますように!

バッファーとは何ですか? Nodejs のバッファー モジュールの詳細については、こちらをご覧ください。

#1.バッファとは何ですか?

JS には文字列、配列、数値、ブール値などを操作するためのメソッド API が対応していますが、Node ではファイル操作、ネットワーク通信、データベース操作、データ送信も必要であることがわかっています。機能; ファイルはストレージ レベルでバイナリ形式で表現され、http リクエストと応答でのデータ送信もバイナリ データで送信されるため、現在の JS 機能だけでは十分ではありません。そのため、Node## バッファ モジュールが必要です。 #で提供されます。

つまり、NodeJS に文字列などのバイナリ データを操作する機能を与えます。バッファは、

一時記憶領域とも呼ばれ、入出力バイナリ データを一時的に保存するメモリのセクションです。

前の記事

Nodejsのコアモジュールについて話します:ストリームモジュール(使用方法を参照)では、大きなファイルを読み取る場合、一般にメモリには読み込まれないことを学びました。データブロックは一度に読み取られますが、データブロックはストリームの形式で読み取られ、連続したデータブロックはデータストリームの概念を形成します。データ ブロックの読み取りおよび書き込みのプロセス中、データはまず buffer (一時バッファ領域) のメモリに保存されて処理されます。

#1.1 バッファ メモリ割り当てを理解する

#バッファ オブジェクトのメモリ割り当ては、V8 のヒープ メモリではなく、C で行われます。ノードのレベルでメモリ アプリケーションを実装します。アプリケーションを効率的に使用してメモリを取得するために、ノードはスラブ割り当てメカニズム (動的メモリ管理メカニズム) を採用します。

1. 2 バッファのグローバルな性質

プロセスの開始時にノードはすでにバッファをメモリにインストールし、バッファをメモリに配置します。グローバル オブジェクトは、使用時に require なしで導入できますが、import または require ステートメントを通じて明示的に参照することが公式に推奨されています。

2. バッファの作成

ファイルの読み取りと http リクエストの取得に加えて、バッファ インスタンスを手動で構築および作成することもできます。

2.1 Buffer.alloc(size[, fill[, encoding]])

パラメータ:

    size: バッファ長
  • fill: 事前に入力された値、デフォルト値: 0
  • encoding: fill が文字列の場合、文字列のエンコーディングです、デフォルト: utf-8
  • import { Buffer } from 'buffer';
    
    const buf = Buffer.alloc(8);
    
    console.log(buf);
    // <Buffer 00 00 00 00 00 00 00 00>

2.2 Buffer.allocUnsafe(size)

パラメータ:

    size: 必要な長さ新しいバッファ
  • この方法で作成されたバッファ インスタンスの基礎となるメモリは初期化されません。新しく作成されたバッファの内容は不明であり、機密データが含まれている可能性があります。
  • import { Buffer } from &#39;buffer&#39;;
    
    const buf = Buffer.allocUnsafe(8);
    
    console.log(buf);
    // <Buffer e8 bf 99 e6 98 af e4 b8 80 e6>

2.3 Buffer.from(string[, encoding])

受信文字列を含む新しいバッファを作成します

パラメータ:

    string: 文字列
  • encoding: エンコーディング、デフォルト値: utf-8
  • import { Buffer } from &#39;buffer&#39;;
    
    const buf = Buffer.from(&#39;hello buffer&#39;);
    
    console.log(buf);
    // <Buffer 68 65 6c 6c 6f 20 62 75 66 66 65 72>

2.4 Buffer.from(array)

0255 array の範囲のバイトを使用して、新しい ## を割り当てます#バッファ###。

import { Buffer } from &#39;buffer&#39;;

const array = [0x62, 0x78, 0x84];
const buf = Buffer.from(array);

console.log(buf);
// <Buffer 62 78 84>
3. バッファのコピー

3.1 Buffer.from(buffer)

パラメータ:

buffer、コピーされるバッファ インスタンス

    import { Buffer } from &#39;buffer&#39;;
    // 新建
    const buf1 = Buffer.alloc(10, 2);
    // 复制
    const buf2 = Buffer.from(buf1);
    
    console.log(buf1);
    // <Buffer 02 02 02 02 02 02 02 02 02 02>
    console.log(buf2);
    // <Buffer 02 02 02 02 02 02 02 02 02 02>
3.2 buf.copy(target[, targetStart[,sourceStart[,sourceEnd]] ] )

buf インスタンスをターゲット target

import { Buffer } from &#39;buffer&#39;;

const buf1 = Buffer.alloc(10, 2);
const buf2 = Buffer.allocUnsafe(10)
// 将buf1复制到buf2
buf1.copy(buf2);

console.log(buf1);
// <Buffer 02 02 02 02 02 02 02 02 02 02>
console.log(buf2);
// <Buffer 02 02 02 02 02 02 02 02 02 02>

4 にコピーします。スプライス バッファ

#4.1 Buffer.concat(list[, totalLength])

リスト内のすべてのバッファ インスタンスが結合された新しいバッファを返します

パラメータ:

list:ce1f03efdfa3a50760234dcf9b3662a8 | 2352a1ddeafcbb075c98dd9a641f874c

    totalLength: 接続の合計長。
  • Note
:

リストにエントリがない場合、または totalLength が 0 の場合、新しい長さ 0 のバッファが返されます。

    totalLength が指定されていない場合は、リスト内の Buffer インスタンスの長さを加算することによって計算されます。
  • import { Buffer } from &#39;buffer&#39;;
    
    const buf1 = Buffer.alloc(4, 2);
    const buf2 = Buffer.alloc(4, 3);
    
    const buf3 = Buffer.concat([buf1, buf2]);
    
    console.log(buf1); // <Buffer 02 02 02 02>
    console.log(buf2); // <Buffer 03 03 03 03>
    console.log(buf3); // <Buffer 02 02 02 02 03 03 03 03>
  • 5. インターセプトバッファ

##5.1 buf.slice([start[, end]])

buf インスタンスから新しい Buffer インスタンスを返します。返された新しい Buffer インスタンスは、ソース buf インスタンスへの参照のみです。つまり、新しく返されたインスタンスへの変更は、元の Buffer インスタンスに影響します# ##パラメーター :###

  • start: 起始位置,默认0
  • end: 结束位置,默认buf.length
import { Buffer } from &#39;buffer&#39;;

const buf1 = Buffer.alloc(10, 2);
// 截取
const buf2 = buf1.slice(1,4);
// 截取部分修改
buf2[0] = 0x63;

console.log(buf1);
// <Buffer 02 63 02 02 02 02 02 02 02 02>
console.log(buf2);
// <Buffer 63 02 02>

6. 填充Buffer

6.1 buf.fill(value[, offset[, end]][, encoding])

参数:

  • value,填充值
  • offset: 在开始填充 buf 之前要跳过的字节数,默认值0
  • end: 结束填充buf(不包括在内)的位置,默认值buf.length
  • encoding,如果value值为字符串,则为字符串编码,默认utf-8
import { Buffer } from &#39;buffer&#39;;

const buf1 = Buffer.allocUnsafe(8).fill(2);

console.log(buf1);
// <Buffer 02 02 02 02 02 02 02 02>

6.2 buf.write(string[, offset[, length]][, encoding])

根据 encoding 中的字符编码将 string 写入 buf 的 offset 处。

注意:length 参数是要写入的字节数。 如果 buf 没有足够的空间来容纳整个字符串,则只会写入 string 的一部分

参数:

  • string: 写入的字符串值
  • offset: 开始写入 string 之前要跳过的字节数,默认值为0
  • length: 写入的最大字节数,默认值buf.length - offset
  • encoding: 编码,默认utf-8
import { Buffer } from &#39;buffer&#39;;
// buf1 length为12
const buf1 = Buffer.alloc(12, 3);
// write offset大于buf1.length,写入无效
buf1.write(&#39;hello&#39;, 12);

console.log(buf1);
// <Buffer 03 03 03 03 03 03 03 03 03 03 03 03>
// 部分写入
buf1.write(&#39;hello&#39;, 10);
// <Buffer 03 03 03 03 03 03 03 03 03 03 68 65>

7. Buffer工具方法

7.1 Buffer.isBuffer(obj)

检验传入obj是否为buffer

import { Buffer } from &#39;buffer&#39;;

const buf1 = Buffer.alloc(12, 3);

console.log(Buffer.isBuffer(buf1));
// true

7.2 Buffer.isEncoding(encoding)

检查传入的编码名称是否被Buffer所支持

import { Buffer } from &#39;buffer&#39;;

console.log(Buffer.isEncoding(&#39;utf-8&#39;))
// true

8. Buffer与String的转换

Buffer转String

8.1 buf.toString([encoding[, start[, end]]])

参数:

  • encoding:使用的字符串编码,默认utf-8
  • start,开始位置,默认0
  • end,结束位置,默认buf.length
import { Buffer } from &#39;buffer&#39;;

const buf1 = Buffer.allocUnsafe(26)

for (let i = 0; i < 26; i++) {
  // 97 是 &#39;a&#39; 的十进制 ASCII 值。
  buf1[i] = i + 97;
}

console.log(buf1.toString())
// abcdefghijklmnopqrstuvwxyz

String转Buffer

8.2 Buffer.from(string[, encoding])

参数:

  • string: 字符串
  • encoding: 编码,默认值:utf-8
import { Buffer } from &#39;buffer&#39;;

const buf = Buffer.from(&#39;hello buffer&#39;);

console.log(buf);
// <Buffer 68 65 6c 6c 6f 20 62 75 66 66 65 72>

9. Buffer与Array的对比

9.1 与Array类似点

  • 可以使用下标获取指定位置的值
  • 可以使用length属性获取Buffer大小
  • 可以使用for...of遍历

9.2 与Array不同之处

  • 存储的是16进制的两位数
  • 值为0-255
  • 支持多种编码格式
  • 内存不在v8堆中分配
  • 底层有c++实现,上层由js控制

更多node相关知识,请访问:nodejs 教程!!

以上がバッファーとは何ですか? Nodejs のバッファー モジュールの詳細については、こちらをご覧ください。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。