💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
## 一、理解Buffer 1. 是一个像 Array 的对象 2. 用于操作字节 3. 在网络流和文件操作中,处理二进制数据。比如:处理网络协议、操作数据库、处理图片、接收上传的文件等。 4. 是 javascript 和 c++ 结合的模块,性能相关部分用c++实现, 非性能相关部分用 javascript 实现 ### buffer 模块结构: ![](https://img.kancloud.cn/2c/e4/2ce4742835717a4e9c37485703bf105d_1069x550.png) ### node 内存的分配 * 在 c++ 层面申请内存 * 在 javascript 中分配内存 * 小内存(小于 8 kb)分配时,采用预先申请,时候分配的规则 * 大内存直接使用 c++提供的内存,无需细腻分配 优点:在处理大量字节的数据时,避免频繁进行内存申请的系统调用,从而减轻对操作系统的压力 ![](https://img.kancloud.cn/83/c5/83c596ec7317b2d9917f49c9cd581e6d_1560x592.png) ![](https://img.kancloud.cn/6f/2b/6f2b64c29f897b07179850e2e1076834_1823x499.png) ## 二、Buffer 对象 **创建 buffer** * Buffer.from() * Buffer.alloc() - 分配指定大小的buffer, 使用零进行初始化 * Buffer.allocUnsafe() - 分配指定大小的buffer,不会被初始化,还有可能包含敏感的旧数据,容易被访问或者泄漏\-**不安全的** ![](https://img.kancloud.cn/87/5b/875bc85bfa5d39d6150c1edb9c4ccbac_1252x202.png) **基础属性** * 元素为 16 进制的两位数 * 中文在 utf 编码下 占用3个字符,英文和标点符号占用1个字符 * 通过 length 属性获取长度 * 通过下标进行赋值 * 使用 write 写入数据到 buffer * `copy()`方法可以复制 buffer * `slice()` 创建切片 buffer ![](https://img.kancloud.cn/0c/ab/0cab2bbc39ff1784f6214342e99fc061_1666x617.png) ![](https://img.kancloud.cn/71/61/71611d741fbf7ab8aefd781454550358_1679x805.png) **buffer 对象的拼接** * 文件可读流在读取buffer时,是逐个读取的 * 会产生乱码 * 通过iconv.decode解决乱码问题(通过将第一次读取(9个)的剩余字符(2个)拼接到后续11个字符的读取中) * 当读取大文件时,highWaterMark值设置的越大,读取速度越快 ![](https://img.kancloud.cn/9f/7f/9f7fc6c3edf629ec5cb050ae7222f378_1771x1320.png) ## 三、Buffer的转换 1. Buffer 转字符串 2. 字符串转 buffer ![](https://img.kancloud.cn/4e/45/4e458b9a4ead621e81d4e449be6906c4_1404x393.png) ##### 乱码是怎么产生的? * 在前9个字符读取出后,最后一个字符不能形成文字,所以以乱码形式展现 ![](https://img.kancloud.cn/65/03/6503b7ffd295a330a7618b73bda49c81_1923x565.png)