登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
AI 队友
登录
注册
Gitee 2025 年度开源项目评选中
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
3
Star
45
Fork
21
DreamCoders
/
CoderGuide
代码
Issues
1169
Pull Requests
0
Wiki
统计
流水线
服务
JavaDoc
PHPDoc
质量分析
Jenkins for Gitee
腾讯云托管
腾讯云 Serverless
悬镜安全
阿里云 SAE
Codeblitz
SBOM
我知道了,不再自动展开
更新失败,请稍后重试!
移除标识
内容风险标识
本任务被
标识为内容中包含有代码安全 Bug 、隐私泄露等敏感信息,仓库外成员不可访问
说说对 Node 中的 Buffer 的理解?应用场景?
待办的
#IAG9L1
陌生人
拥有者
创建于
2024-07-29 16:04
<h2>一、是什么</h2> <p>在<code>Node</code>应用中,需要处理网络协议、操作数据库、处理图片、接收上传文件等,在网络流和文件的操作中,要处理大量二进制数据,而<code>Buffer</code>就是在内存中开辟一片区域(初次初始化为8KB),用来存放二进制数据</p> <p>在上述操作中都会存在数据流动,每个数据流动的过程中,都会有一个最小或最大数据量</p> <p>如果数据到达的速度比进程消耗的速度快,那么少数早到达的数据会处于等待区等候被处理。反之,如果数据到达的速度比进程消耗的数据慢,那么早先到达的数据需要等待一定量的数据到达之后才能被处理</p> <p>这里的等待区就指的缓冲区(Buffer),它是计算机中的一个小物理单位,通常位于计算机的 <code>RAM</code> 中</p> <p>简单来讲,<code>Nodejs</code>不能控制数据传输的速度和到达时间,只能决定何时发送数据,如果还没到发送时间,则将数据放在<code>Buffer</code>中,即在<code>RAM</code>中,直至将它们发送完毕</p> <p>上面讲到了<code>Buffer</code>是用来存储二进制数据,其的形式可以理解成一个数组,数组中的每一项,都可以保存8位二进制:<code>00000000</code>,也就是一个字节</p> <p>例如:</p> <pre><code class="language-js">const buffer = Buffer.from("why")</code></pre> <p>其存储过程如下图所示:</p> <p><img src="https://static.ecool.fun//article/e3147a80-c494-4d9b-b9f1-1798213fd233.png" alt="" /></p> <h2>二、使用方法</h2> <p><code>Buffer</code> 类在全局作用域中,无须<code>require</code>导入</p> <p>创建<code>Buffer</code>的方法有很多种,我们讲讲下面的两种常见的形式:</p> <ul> <li> <p>Buffer.from()</p> </li> <li> <p>Buffer.alloc() </p> </li> </ul> <h3>Buffer.from()</h3> <pre><code class="language-js">const b1 = Buffer.from('10'); const b2 = Buffer.from('10', 'utf8'); const b3 = Buffer.from([10]); const b4 = Buffer.from(b3); console.log(b1, b2, b3, b4); // <Buffer 31 30> <Buffer 31 30> <Buffer 0a> <Buffer 0a></code></pre> <h3>Buffer.alloc()</h3> <pre><code class="language-js">const bAlloc1 = Buffer.alloc(10); // 创建一个大小为 10 个字节的缓冲区 const bAlloc2 = Buffer.alloc(10, 1); // 建一个长度为 10 的 Buffer,其中全部填充了值为 `1` 的字节 console.log(bAlloc1); // <Buffer 00 00 00 00 00 00 00 00 00 00> console.log(bAlloc2); // <Buffer 01 01 01 01 01 01 01 01 01 01></code></pre> <p>在上面创建<code>buffer</code>后,则能够<code>toString</code>的形式进行交互,默认情况下采取<code>utf8</code>字符编码形式,如下</p> <pre><code class="language-js">const buffer = Buffer.from("你好"); console.log(buffer); // <Buffer e4 bd a0 e5 a5 bd> const str = buffer.toString(); console.log(str); // 你好</code></pre> <p>如果编码与解码不是相同的格式则会出现乱码的情况,如下:</p> <pre><code class="language-js">const buffer = Buffer.from("你好","utf-8 "); console.log(buffer); // <Buffer e4 bd a0 e5 a5 bd> const str = buffer.toString("ascii"); console.log(str); // d= e%=</code></pre> <p>当设定的范围导致字符串被截断的时候,也会存在乱码情况,如下:</p> <pre><code class="language-js">const buf = Buffer.from('Node.js 技术栈', 'UTF-8'); console.log(buf) // <Buffer 4e 6f 64 65 2e 6a 73 20 e6 8a 80 e6 9c af e6 a0 88> console.log(buf.length) // 17 console.log(buf.toString('UTF-8', 0, 9)) // Node.js � console.log(buf.toString('UTF-8', 0, 11)) // Node.js 技</code></pre> <p>所支持的字符集有如下:</p> <ul> <li>ascii:仅支持 7 位 ASCII 数据,如果设置去掉高位的话,这种编码是非常快的</li> <li>utf8:多字节编码的 Unicode 字符,许多网页和其他文档格式都使用 UTF-8</li> <li>utf16le:2 或 4 个字节,小字节序编码的 Unicode 字符,支持代理对(U+10000至 U+10FFFF)</li> <li>ucs2,utf16le 的别名</li> <li>base64:Base64 编码</li> <li>latin:一种把 Buffer 编码成一字节编码的字符串的方式</li> <li>binary:latin1 的别名,</li> <li>hex:将每个字节编码为两个十六进制字符</li> </ul> <h2>三、应用场景</h2> <p><code>Buffer</code>的应用场景常常与流的概念联系在一起,例如有如下:</p> <ul> <li>I/O操作</li> <li>加密解密</li> <li>zlib.js</li> </ul> <h3>I/O操作</h3> <p>通过流的形式,将一个文件的内容读取到另外一个文件</p> <pre><code class="language-js">const fs = require('fs'); const inputStream = fs.createReadStream('input.txt'); // 创建可读流 const outputStream = fs.createWriteStream('output.txt'); // 创建可写流 inputStream.pipe(outputStream); // 管道读写</code></pre> <h3>加解密</h3> <p>在一些加解密算法中会遇到使用 <code>Buffer</code>,例如 <code>crypto.createCipheriv</code> 的第二个参数 <code>key</code> 为 <code>string</code> 或 <code>Buffer</code> 类型</p> <h3>zlib.js</h3> <p><code>zlib.js</code> 为 <code>Node.js</code> 的核心库之一,其利用了缓冲区(<code>Buffer</code>)的功能来操作二进制数据流,提供了压缩或解压功能</p>
<h2>一、是什么</h2> <p>在<code>Node</code>应用中,需要处理网络协议、操作数据库、处理图片、接收上传文件等,在网络流和文件的操作中,要处理大量二进制数据,而<code>Buffer</code>就是在内存中开辟一片区域(初次初始化为8KB),用来存放二进制数据</p> <p>在上述操作中都会存在数据流动,每个数据流动的过程中,都会有一个最小或最大数据量</p> <p>如果数据到达的速度比进程消耗的速度快,那么少数早到达的数据会处于等待区等候被处理。反之,如果数据到达的速度比进程消耗的数据慢,那么早先到达的数据需要等待一定量的数据到达之后才能被处理</p> <p>这里的等待区就指的缓冲区(Buffer),它是计算机中的一个小物理单位,通常位于计算机的 <code>RAM</code> 中</p> <p>简单来讲,<code>Nodejs</code>不能控制数据传输的速度和到达时间,只能决定何时发送数据,如果还没到发送时间,则将数据放在<code>Buffer</code>中,即在<code>RAM</code>中,直至将它们发送完毕</p> <p>上面讲到了<code>Buffer</code>是用来存储二进制数据,其的形式可以理解成一个数组,数组中的每一项,都可以保存8位二进制:<code>00000000</code>,也就是一个字节</p> <p>例如:</p> <pre><code class="language-js">const buffer = Buffer.from("why")</code></pre> <p>其存储过程如下图所示:</p> <p><img src="https://static.ecool.fun//article/e3147a80-c494-4d9b-b9f1-1798213fd233.png" alt="" /></p> <h2>二、使用方法</h2> <p><code>Buffer</code> 类在全局作用域中,无须<code>require</code>导入</p> <p>创建<code>Buffer</code>的方法有很多种,我们讲讲下面的两种常见的形式:</p> <ul> <li> <p>Buffer.from()</p> </li> <li> <p>Buffer.alloc() </p> </li> </ul> <h3>Buffer.from()</h3> <pre><code class="language-js">const b1 = Buffer.from('10'); const b2 = Buffer.from('10', 'utf8'); const b3 = Buffer.from([10]); const b4 = Buffer.from(b3); console.log(b1, b2, b3, b4); // <Buffer 31 30> <Buffer 31 30> <Buffer 0a> <Buffer 0a></code></pre> <h3>Buffer.alloc()</h3> <pre><code class="language-js">const bAlloc1 = Buffer.alloc(10); // 创建一个大小为 10 个字节的缓冲区 const bAlloc2 = Buffer.alloc(10, 1); // 建一个长度为 10 的 Buffer,其中全部填充了值为 `1` 的字节 console.log(bAlloc1); // <Buffer 00 00 00 00 00 00 00 00 00 00> console.log(bAlloc2); // <Buffer 01 01 01 01 01 01 01 01 01 01></code></pre> <p>在上面创建<code>buffer</code>后,则能够<code>toString</code>的形式进行交互,默认情况下采取<code>utf8</code>字符编码形式,如下</p> <pre><code class="language-js">const buffer = Buffer.from("你好"); console.log(buffer); // <Buffer e4 bd a0 e5 a5 bd> const str = buffer.toString(); console.log(str); // 你好</code></pre> <p>如果编码与解码不是相同的格式则会出现乱码的情况,如下:</p> <pre><code class="language-js">const buffer = Buffer.from("你好","utf-8 "); console.log(buffer); // <Buffer e4 bd a0 e5 a5 bd> const str = buffer.toString("ascii"); console.log(str); // d= e%=</code></pre> <p>当设定的范围导致字符串被截断的时候,也会存在乱码情况,如下:</p> <pre><code class="language-js">const buf = Buffer.from('Node.js 技术栈', 'UTF-8'); console.log(buf) // <Buffer 4e 6f 64 65 2e 6a 73 20 e6 8a 80 e6 9c af e6 a0 88> console.log(buf.length) // 17 console.log(buf.toString('UTF-8', 0, 9)) // Node.js � console.log(buf.toString('UTF-8', 0, 11)) // Node.js 技</code></pre> <p>所支持的字符集有如下:</p> <ul> <li>ascii:仅支持 7 位 ASCII 数据,如果设置去掉高位的话,这种编码是非常快的</li> <li>utf8:多字节编码的 Unicode 字符,许多网页和其他文档格式都使用 UTF-8</li> <li>utf16le:2 或 4 个字节,小字节序编码的 Unicode 字符,支持代理对(U+10000至 U+10FFFF)</li> <li>ucs2,utf16le 的别名</li> <li>base64:Base64 编码</li> <li>latin:一种把 Buffer 编码成一字节编码的字符串的方式</li> <li>binary:latin1 的别名,</li> <li>hex:将每个字节编码为两个十六进制字符</li> </ul> <h2>三、应用场景</h2> <p><code>Buffer</code>的应用场景常常与流的概念联系在一起,例如有如下:</p> <ul> <li>I/O操作</li> <li>加密解密</li> <li>zlib.js</li> </ul> <h3>I/O操作</h3> <p>通过流的形式,将一个文件的内容读取到另外一个文件</p> <pre><code class="language-js">const fs = require('fs'); const inputStream = fs.createReadStream('input.txt'); // 创建可读流 const outputStream = fs.createWriteStream('output.txt'); // 创建可写流 inputStream.pipe(outputStream); // 管道读写</code></pre> <h3>加解密</h3> <p>在一些加解密算法中会遇到使用 <code>Buffer</code>,例如 <code>crypto.createCipheriv</code> 的第二个参数 <code>key</code> 为 <code>string</code> 或 <code>Buffer</code> 类型</p> <h3>zlib.js</h3> <p><code>zlib.js</code> 为 <code>Node.js</code> 的核心库之一,其利用了缓冲区(<code>Buffer</code>)的功能来操作二进制数据流,提供了压缩或解压功能</p>
评论 (
0
)
登录
后才可以发表评论
状态
待办的
待办的
进行中
已完成
已关闭
负责人
未设置
标签
Node
未设置
标签管理
里程碑
未关联里程碑
未关联里程碑
Pull Requests
未关联
未关联
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
未关联
未关联
master
开始日期   -   截止日期
-
置顶选项
不置顶
置顶等级:高
置顶等级:中
置顶等级:低
优先级
不指定
严重
主要
次要
不重要
参与者(1)
1
https://gitee.com/DreamCoders/CoderGuide.git
git@gitee.com:DreamCoders/CoderGuide.git
DreamCoders
CoderGuide
CoderGuide
点此查找更多帮助
搜索帮助
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册