NodeJS —— Buffer 解读

Nodejs——Buffer(缓冲器) Buffer 本质是一段内存空间,专门用来处理。Buffer 是一个类似于数组的。方法将 Buffer 转为字符串。toString 默认是按照。,用于表示固定长度的字节序列。Buffer 可以直接通过。的方式对数据进行处理。编码方式进行转换的。 阅读详情

在这里插入图片描述


阅读原文


Buffer 概述

在 ES6 引入 TypedArray 之前,JavaScript 语言没有读取或操作二进制数据流的机制。 Buffer 类被引入作为 NodeJS API 的一部分,使其可以在 TCP 流或文件系统操作等场景中处理二进制数据流。
Buffer 属于 Global 对象,使用时不需引入,且 Buffer 的大小在创建时确定,无法调整。


创建 Buffer

在 NodeJS v6.0.0 版本之前,Buffer 实例是通过 Buffer 构造函数创建的,即使用 new 关键字创建,它根据提供的参数返回不同的 Buffer,但在之后的版本中这种声明方式就被废弃了,替代 new 的创建方式主要有以下几种。

1、Buffer.alloc 和 Buffer.allocUnsafe

用 Buffer.alloc 和 Buffer.allocUnsafe 创建 Buffer 的传参方式相同,参数为创建 Buffer 的长度,数值类型。

// Buffer.alloc 和 Buffer.allocUnsafe 创建 Buffer
// Buffer.alloc 创建 Buffer
let buf1 = Buffer.alloc(6);

// Buffer.allocUnsafe 创建 Buffer
let buf2 = Buffer.allocUnsafe(6);

console.log(buf1); // <Buffer 00 00 00 00 00 00>
console.log(buf2); // <Buffer 00 e7 8f a0 00 00>

通过代码可以看出,用 Buffer.alloc 和 Buffer.allocUnsafe 创建 Buffer 是有区别的,Buffer.alloc 创建的 Buffer 是被初始化过的,即 Buffer 的每一项都用 00 填充,而 Buffer.allocUnsafe 创建的 Buffer 并没有经过初始化,在内存中只要有闲置的 Buffer 就直接 “抓过来” 使用。

Buffer.allocUnsafe 创建 Buffer 使得内存的分配非常快,但已分配的内存段可能包含潜在的敏感数据,有明显性能优势的同时又是不安全的,所以使用需格外 “小心”。

2、Buffer.from

Buffer.from 支持三种传参方式:

  • 第一个参数为字符串,第二个参数为字符编码,如 ASCII、UTF-8、Base64 等等。
  • 传入一个数组,数组的每一项会以十六进制存储为 Buffer 的每一项。
  • 传入一个 Buffer,会将 Buffer 的每一项作为新返回 Buffer 的每一项。

传入字符串和字符编码:

// 传入字符串和字符编码
let buf = Buffer.from("hello", "utf8");

console.log(buf); // <Buffer 68 65 6c 6c 6f>

传入数组:

// 数组成员为十进制数
let buf = Buffer.from([1, 2, 3]);

console.log(buf); // <Buffer 01 02 03>
// 数组成员为十六进制数
let buf = Buffer.from([0xe4, 0xbd, 0xa0, 0xe5, 0xa5, 0xbd]);

console.log(buf); // <Buffer e4 bd a0 e5 a5 bd>
console.log(buf.toString("utf8")); // 你好

在 NodeJS 中不支持 GB2312 编码,默认支持 UTF-8,在 GB2312 中,一个汉字占两个字节,而在 UTF-8 中,一个汉字占三个字节,所以上面 “你好” 的 Buffer 为 6 个十六进制数组成。

// 数组成员为字符串类型的数字
let buf = Buffer.from(["1", "2", "3"]);

console.log(buf); // <Buffer 01 02 03>

传入的数组成员可以是任何进制的数值,当成员为字符串的时候,如果值是数字会被自动识别成数值类型,如果值不是数字或成员为是其他非数值类型的数据,该成员会被初始化为 00。

创建的 Buffer 可以通过 toString 方法直接指定编码进行转换,默认编码为 UTF-8。

传入 Buffer:

// 传入一个 Buffer
let buf1 = Buffer.from("hello", "utf8");

let buf2 = Buffer.from(buf1);

console.log(buf1); // <Buffer 68 65 6c 6c 6f>
console.log(buf2); // <Buffer 68 65 6c 6c 6f>
console.log(buf1 === buf2); // true
console.log(buf1[0] === buf2[0]); // false

当传入的参数为一个 Buffer 的时候,会创建一个新的 Buffer 并复制上面的每一个成员。

Buffer 为引用类型,一个 Buffer 复制了另一个 Buffer 的成员,当其中一个 Buffer 复制的成员有更改,另一个 Buffer 对应的成员会跟着改变,因为指向同一个引用,类似于 “二维数组”。

// Buffer 类比二维数组
let arr1 = [1, 2, [3]];
let arr2 = arr1.slice();

arr2[2][0] = 5;
console.log(arr1); // [1, 2, [5]]

Buffer 的常用方法

1、fill

Buffer 的 fill 方法可以向一个 Buffer 中填充数据,支持传入三个参数:

  • value:将要填充的数据;
  • start:填充数据的开始位置,不指定默认为 0;
  • end:填充数据的结束位置,不指定默认为 Buffer 的长度。
let buf = Buffer.alloc(3);

buf.fill(1);
console.log(buf); // <Buffer 01 01 01>
let buf = Buffer.alloc(6);

buf.fill(1, 2, 4);
console.log(buf); // <Buffer 00 00 01 01 00 00>

上面代码可以看出填充数据是 “包前不包后的”,fill 的第一个参数也支持是多个字节,从被填充 Buffer 的起始位置开始,一直到结束,会循环填充这些字节,剩余的位置不够填充这几个字节,会填到哪算哪,有可能不完整,如果 fill 指定的结束位置大于了 Buffer 的长度,会抛出 RangeError 的异常。

let buf = Buffer.alloc(6);

buf.fill("abc", 1, 5);
console.log(buf); // <Buffer 00 61 62 63 61 00>
let buf = Buffer.alloc(3);

buf.fill("abc", 4, 8);
console.log(buf); // throw new errors.RangeError('ERR_INDEX_OUT_OF_RANGE');

2、slice

Buffer 的 slice 方法与数组的 slice 方法用法完全相同,相信数组的 slice 已经足够熟悉了,这里就不多赘述了,Buffer 中截取出来的都是 Buffer。

let buf = Buffer.from("hello", "utf8");

let a = buf.slice(0, 2);
let b = buf.slice(2);
let b = buf.slice(-2);

console.log(a.toString()); // he
console.log(b.toString()); // llo
console.log(c.toString()); // o

3、indexOf

Buffer 的 indexOf 用法与数组和字符串的 indexOf 类似,第一个参数为查找的项,第二个参数为查找的起始位置,不同的是,对于 Buffer 而言,查找的可能是一个字符串,代表多个字节,查找的字节在 Buffer 中必须有连续相同的字节,返回连续的字节中第一个字节的索引,没查找到返回 -1。

let buf = Buffer.from("你*好*吗", "utf8");

console.log(buf); // <Buffer e4 bd a0 2a e5 a5 bd 2a e5 90 97>
console.log(buf.indexOf("*")); // 3
console.log(buf.indexOf("*", 4)); // 7

4、copy

Buffer 的 copy 方法用于将一个 Buffer 的字节复制到另一个 Buffer 中去,有四个参数:

  • target:目标 Buffer
  • targetStart:目标 Buffer 的起始位置
  • sourceStart:源 Buffer 的起始位置
  • sourceEnd:源 Buffer 的结束位置
// 容器 Buffer 长度充足
let targetBuf = Buffer.alloc(6);
let sourceBuf = Buffer.from("你好", "utf8");

// 将 “你好” 复制到 targetBuf 中
sourceBuf.copy(targetBuf, 0, 0, 6);

console.log(targetBuf.toString()); // 你好
// 容器 Buffer 长度不足
let targetBuf = Buffer.alloc(3);
let sourceBuf = Buffer.from("你好", "utf8");

sourceBuf.copy(targetBuf, 0, 0, 6);
console.log(targetBuf.toString()); // 你

上面第二个案例中虽然要把整个源 Buffer 都复制进目标 Buffer 中,但是由于目标 Buffer 的长度只有 3,所以最终只能复制进去一个 “你” 字。

Buffer 与数组不同,不能通过操作 length 和索引改变 Buffer 的长度,Buffer 一旦被创建,长度将保持不变。

// 数组对比 Buffer —— 操作 length
// 数组
let arr = [1, 2, 3];
arr[3] = 4;
console.log(arr); // [1, 2, 3, 4]

arr.length = 5;
console.log(arr); // [1, 2, 3, 4, empty]


// Buffer
let buf = Buffer.alloc(3);
buf[3] = 0x00;
console.log(buf); // <Buffer 00 00 00>

buf.length = 5;
console.log(buf); // <Buffer 00 00 00>
console.log(buf.length); // 3

通过上面代码可以看出数组可以通过 length 和索引对数组的长度进行改变,但是 Buffer 中类似的操作都是不生效的。

copy 方法的 Polyfill:

// 模拟 copy 方法
Buffer.prototype.myCopy = function (target, targetStart, sourceStart, sourceEnd) {
    for(let i = 0; i < sourceEnd - sourceStart; i++) {
        target[targetStart + i] = this[sourceStart + i];
    }
}

5、Buffer.concat

与数组类似,Buffer 也存在用于拼接多个 Buffer 的方法 concat,不同的是 Buffer 中的 concat 不是实例方法,而是静态方法,通过 Buffer.concat 调用,且传入的参数不同。

Buffer.concat 有两个参数,返回值是一个新的 Buffer:

  • 第一个参数为一个数组,数组中的每一个成员都是一个 Buffer;
  • 第二个参数代表新 Buffer 的长度,默认值为数组中每个 Buffer 长度的总和。

Buffer.concat 会将数组中的 Buffer 进行拼接,存入新 Buffer 并返回,如果传入第二个参数规定了返回 Buffer 的长度,那么返回值存储拼接后前规定长度个字节。

let buf1 = Buffer.from("你", "utf8");
let buf2 = Buffer.from("好", "utf8");

let result1 = Buffer.concat([buf1, buf2]);
let result2 = Buffer.concat([buf1, buf2], 3);

console.log(result1); // <Buffer e4 bd a0 e5 a5 bd>
console.log(result1.toString()); // 你好

console.log(result2); // <Buffer e4 bd a0>
console.log(result2.toString()); // 你

Buffer.concat 方法的 Polyfill:

// 模拟 Buffer.concat
Buffer.myConcat = function (bufferList, len) {
    // 新 Buffer 的长度
    len = len || bufferList.reduce((prev, next) => prev + next.length, 0);

    let newBuf = Buffer.alloc(len); // 创建新 Buffer
    let index = 0; // 下次开始的索引

    // 循环存储 Buffer 的数组进行复制
    bufferList.forEach(buf => {
        buf.myCopy(newBuf, index, 0, buf.length);
        index += buf.length;
    });

    return newBuf;
}

6、Buffer.isBuffer

Buffer.isBuffer 是用来判断一个对象是否是一个 Buffer,返回布尔值。

let obj = {};
let buf = Buffer.alloc(6);

console.log(Buffer.isBuffer(obj)); // false
console.log(Buffer.isBuffer(buf)); // true

封装一个 split

字符串中的 split 是经常使用的方法,可以用分隔符将字符串切成几部分存储在数组中,Buffer 本身没有 split 方法,但是也会有类似的使用场景,所以我们在 Buffer 中自己封装一个 split。

Buffer 的 split 方法参数为一个分隔符,这个分隔符可能是一个或多个字节的内容,返回值为一个数组,分隔开的部分作为独立的 Buffer 存储在返回的数组中。

// 封装 Buffer 的 split 方法
Buffer.prototype.split = function (sep) {
    let len = Buffer.from(sep).length; // 分隔符所占的字节数
    let result = []; // 返回的数组
    let start = 0; // 查找 Buffer 的起始位置
    let offset = 0; // 偏移量

    // 循环查找分隔符
    while ((offset = this.indexOf(sep, start)) !== -1) {
        // 将分隔符之前的部分截取出来存入
        result.push(this.slice(start, offset));
        start = offset + len;
    }

    // 处理剩下的部分
    result.push(this.slice(start));

    // 返回结果
    return result;
}

验证 split 方法:

// 验证 split
let buf = Buffer.from("哈登爱篮球爱夜店", "utf8");
let bufs = buf.split("爱");

console.log(bufs);
// [ <Buffer e5 93 88 e7 99 bb>,
//   <Buffer e7 af ae e7 90 83>,
//   <Buffer e5 a4 9c e5 ba 97> ]

newBufs = bufs.map(buf => buf.toString());
console.log(newBufs); // [ '哈登', '篮球', '夜店' ]

Buffer 的编码转换

我们知道 NodeJS 中的默认编码为 UTF-8,且不支持 GB2312 编码,假如现在有一个编码格式为 GB2312 的 txt 文件,内容为 “你好”,现在我们使用 NodeJS 去读取它,由于在 UTF-8 与 GB2312 编码中汉字所占字节数不同,所以读出的内容无法解析,即为乱码。

// 引入依赖
const fs = require("fs");
const path = require("path");

let buf = Buffer.from("你好", "utf8");
let result = fs.readFileSync(path.resolve(__dirname, "a.txt"));

console.log(buf); // <Buffer e4 bd a0 e5 a5 bd>
console.log(buf.toString()); // 你好
console.log(result); // <Buffer c4 e3 ba c3>
console.log(result.toString()); // ���

如果一定要在 NodeJS 中来正确解析这样的内容,这样的问题还是有办法解决的,我们需要借助 iconv-lite 模块,这个模块可以将一个 Buffer 按照指定的编码格式进行编码或解码。

由于 iconv-lite 是第三方提供的模块,在使用前需要安装,安装命令如下:

npm install iconv-lite

如果想正确的读出其他编码格式文件的内容,上面代码应该更改为:

// 引入依赖
const fs = require("fs");
const path = require("path");
const iconvLite = require("iconv-lite");

let result = fs.readFileSync(path.resolve(__dirname, "a.txt"));

console.log(iconvLite.decode(result, "gb2312")); // 你好

去掉 BOM 头

上面读取 GB2312 编码的 txt 文件也可以通过打开文件重新保存为 UTF-8 或用编辑器直接将编码手动修改为 UTF-8,此时读取的文件不需要进行编码转换,但是会产生新的问题。

// 产生 BOM 头
// 引入依赖
const fs = require("fs");
const path = require("path");

let buf = Buffer.from("你好", "utf8");
let result = fs.readFileSync(path.resolve(__dirname, "a.txt"));

console.log(buf); // <Buffer e4 bd a0 e5 a5 bd>
console.log(result); // <Buffer ef bb bf e4 bd a0 e5 a5 bd>

在手动修改 txt 文件编码后执行上面代码,发现读取的 Buffer 与正常情况相比前面多出了三个字节,只要存在文件编码的修改就会在这个文件的前面产生多余的字节,叫做 BOM 头。

BOM 头是用来判断文本文件是哪一种 Unicode 编码的标记,其本身是一个 Unicode 字符,位于文本文件头部。

虽然 BOM 头起到了标记文件编码的作用,但是它并不属于文件的内容部分,因此会产生一些问题,如文件编码发生变化后无法正确读取文件的内容,或者多个文件在合并的过程中,中间会夹杂着这些多余内容,所以在 NodeJS 文件操作的源码中,Buffer 编码转换的模块 iconv-lite 中,以及 Webpack 对项目文件进行打包编译时都进行了去掉 BOM 头的操作。

为了让上面的代码可以正确的读取并解析编码被手动修改过的文件内容,我们这里也需要进行去掉 BOM 头的操作。

// 去掉 BOM 头的方法
function BOMStrip(result) {
    if (Buffer.isBuffer(result)) {
        // 如果读取的内容为 Buffer
        if (result[0] === 0xef && result[1] === 0xbb && result[2] === 0xbf) {
            // 若前三个字节是否和 BOM 头的前三字节相同,去掉 BOM 头
            return Buffer.slice(3);
        }
    } else {
        // 如果不是 Buffer
        if (result.charCodeAt(0) === 0xfeff) {
            // 判断第一项是否和 BOM 头的十六进制相同,去掉 BOM 头
            return result.slice(1);
        }
    }
}

使用去掉 BOM 头的方法并验证上面读文件的案例:

// 验证去 BOM 头的方法
// 引入依赖
const fs = require("fs");
const path = require("path");

// 两种方式读文件
let result1 = fs.readFileSync(path.resolve(__dirname, "a.txt"));
let result2 = fs.readFileSync(path.resolve(__dirname, "a.txt"), "utf8");

console.log(BOMStrip(result1).toString()); // 你好
console.log(BOMStrip(result2)); // 你好

缓存 Buffer

// 产生乱码问题
let buf = Buffer.from("你好", "utf8");

let a = buf.slice(0, 2);
let b = buf.slice(2, 6);

console.log(a.toString()); // �
console.log(b.toString()); // �好

UTF-8 编码,一个汉字三个字节,使用 slice 方法对一个表达汉字的 Buffer 进行截取,如果截取长度不是 3 的整数倍,此时无法正确解析,会显示乱码,类似这种情况可以使用模块 string_decoder 对不能组成汉字的 Buffer 进行缓存,string_decoder 是核心模块,不需要安装。

// 缓存 Buffer
// 引入依赖
const { StringDecoder } = require("string_decoder");

let buf = Buffer.from("你好", "utf8");

let a = buf.slice(0, 2);
let b = buf.slice(2, 6);

// 创建 StringDecoder 实例
let sd = new StringDecoder();

console.log(sd.write(a));
console.log(sd.write(b)); // 你好

上面代码中使用了 string_decoder 后,截取的 Buffer 不能组成一个汉字的时候不打印,进行缓存,等到可以正确解析时取出缓存,重新拼接后打印。


Node.js Stream 模块详解 阅读详情

相关推荐

Node.js中的Buffer:基本概念、核心特性与实战应用

‌二进制容器‌:Buffer是用于存储原始二进制数据的类数组对象‌内存分配‌:在V8堆外分配固定大小的连续内存空间‌应用场景‌:网络通信、文件操作、图像处理等二进制数据流处理// 创建包含ASCII字符的BufferBuffer作为Node.js的核心模块,在系统级开发中发挥着不可替代的作用。随着ES6引入TypedArray,现代Node.js版本已实现Buffer与ArrayBuffer的深度集成。网络协议解析文件格式处理加密算法实现高性能数据处理扩展阅读‌。

码农捻旧的博客 984

nodejs入门教程9:nodejs Buffer

通过掌握Buffer的创建和使用方法,可以更好地处理Node.js中的二进制数据。

1417

pcb印刷电路缺陷检测----数据集准备

PKU-Market-PCB 印刷电路板 (PCB) 瑕疵数据集是一个公共合成 PCB 数据集,包含 1,386 张图像,具有 6 种缺陷(漏孔、鼠咬、开路、短路、杂散、杂铜),可用于图像检测、分类和配准任务。

qq_30190551的博客 4432

Node.js入门:Buffer对象学习

计算机底层存储的数据都是二进制的。在前端开发中一般都是实现页面效果,很少会直接操作二进制的数据。而在 Node.js 擅长的领域,比如在服务端程序开发中,经常会读取文件,处理文件,和二进制数据打交道比较多。Buffer对象是 Node.js 提供的一个全局对象,专门用来处理二进制数据。二进制数据在开发中,操作和表示都非常不方便,所以 Buffer 对象采用十六进制来表示二进制数据。比如二进制数据00001111,转为十六进制就是f。

昆吾kw的博客 2111

在linux上本地大模型部署与推理

您的Python脚本(客户端)可能在您的个人电脑上,而模型服务(服务器)在远程Linux服务器上。如果您的服务器有强大的NVIDIA GPU,并且您对性能有更高的要求(例如需要高吞吐量),vLLM是更好的选择。这种方式无需向公网暴露服务器端口,而是通过加密的SSH通道将服务器的端口“映射”到您的本地电脑上。我们将启动一个API服务器,它会加载您指定的模型,并等待您的代码前来调用。如果您直接在SSH窗口运行上面的命令,一旦您关闭窗口,服务就会停止。这是根据您的原始代码修改的版本,适配本地vLLM服务。

frostmelody 全网同名,大家多多关注呀~ 持续分享优质内容! 2054

别再只会用Kriging了!用Python+GeoPandas手把手实现IDW插值(附完整代码与可视化)

本文详细介绍了如何使用Python和GeoPandas实现反距离加权插值(IDW),包括核心算法、参数调优和可视化技巧。通过完整代码示例,帮助读者掌握这一空间数据分析技术,适用于环境监测、气象预报等多个领域,提升数据处理效率和灵活性。

weixin_30872157的博客 225

Node.js v4.2.1(Argon LTS)发布深度解读:回归修复、已知问题与发布工件校验

本文基于 nodejs.org 仓库中官方发布的 [v4.2.1 发布公告](https://link.gitcode.com/i/e3367a054ae73dc09d8b57277f2ae5a5) 展开,系统梳理 Node.js v4.2.1(首个 LTS 系列 Argon 的补丁版)修复的两项关键回归、完整的已知问题清单、三条提交明细、覆盖 8 个平台家族的下载工件,以及基于 SHA256 与

gitblog_00281的博客 17

让 RAP 弹窗参数真正变成必填:Excel Upload Action 的两种实现路径

摘要 在RAP应用中,action弹窗参数经常缺乏必填校验,导致用户体验差。本文提出两种解决方案:1)在action实现中手动校验,简单但交互不流畅;2)通过root abstract entity和abstract BDEF建模,利用field(mandatory)实现框架级校验,推荐此长期方案。后者将约束集中到模型层,使UI与执行期校验一致,特别适合ABAP Cloud环境。以Excel导入为例,强制填写备注和明确选择试运行,可避免审计问题,提升系统可靠性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 198

postman json report中nodejs 的buffer使用java解析

1、postman中使用newman导出json报告 newman命令可以生生成 jsonOut.json报告 newman run c:\test1.json --reporters cli,html,json,junit --reporter-json-export jsonOut.json --reporter-junit-export xmlOut.xml --reporter-htm...

zhuxi960的博客 798

筹码峰五句口诀,看懂主力的秘密动作!(附实战图示)

筹码图的价值在于,它不像K线那样容易造假。主力可以骗线,但骗不了筹码分布。主力在不在;是吸筹还是出货;接下来是变盘还是震荡。这五句口诀可以说是“筹码阅读的入门圣经”:单峰坚挺变盘在即,双峰对垒高抛低吸;上峰不移主力在跑,多峰林立行情不止;下峰不移不离不弃,筹码识庄稳中取利!📌市场从来不是靠猜,而是靠看清。筹码,就是主力最真实的痕迹。如果你想学会提前布局、跟庄不被甩,学会看筹码峰——这一步必须打牢!

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1164

zabbix系列:内存VM.MEMORY.SIZE监控之total、free、pused、available 参数说明

free -m buffer是即将要被写入磁盘的,而cache是被从磁盘中读出来的. zabbix Web total:1046/1024=1.02G Available:216/1046=20.65% zabbix参数 total- 总物理内存. free- 可用内存. active- 内存当前使用或最近使用,所以它在RAM中。 inactive- 未使用内存. wired- 被标记为始终驻留在RAM中的内...

NIO4444 5667

Nodejs 解读

Nodejs 解读 概念 Node.js® 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境。 Nodejs可以做什么 轻量级、高性能的 Web 服务 前后端 JavaScript 的同构开发 便捷高效的前端工程化 Nodejs架构 Natives modules ...

weixin_44479322的博客 715

人工智能智能体研究综述:从理论架构到前沿应用

AI Agent,即人工智能智能体,是指能够在特定环境中自主感知、推理、决策并执行行动以实现特定目标的智能系统[1]。自主性反应性主动性(Pro-activeness)和社会性fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;AI Agent核心特征自主性 Autonomy反应性 Reactivity主动性 Pro-activeness。

nmdbbzcl的博客 902

nodeJS基础--缓存Buffer

# Buffer类 [官方文档Buffer解读](http://nodejs.cn/api/buffer.html#buffer_class_buffer) Buffer 实例一般用于表示编码字符的序列,比如 UTF-8 、 UCS2 、 Base64 、或十六进制编码的数据。 通过使用显式的字符编码,就可以在 Buffer 实例与普通的 JavaScript 字符串之间进行相互转换。

web_zhuo的博客 575

SAP 针对不同行业(制造业、零售业、金融业)推出了专属的云解决方案,以下是各行业的核心方案与特点

SAP推出行业专属云解决方案:制造业(SAP Digital Manufacturing Cloud)提供AI排产与质量预警,降低缺陷率;零售业(S/4HANA Cloud零售版)实现AI预测补货与全渠道库存同步,减少浪费;金融业(Business ByDesign)支持合规自动化与实时风控,降低审计成本。各方案均采用云原生架构,典型案例显示实施效果显著。

金牌架构师 492

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

NodeJS研究笔记:利用Buffer类的二进制数据读取接口解析ELF文件格式

javascript 作为前端开发语言,自古来对二进制数据的读取解析方面的支持都很薄弱,一般来说,解析二进制数据时,往往是将数据转换成字符串,然后运用各种字符串操作技巧来实现二进制数据的读取。由于NodeJS 作为后台服务器开发平台,数理逻辑的设计需求超越javascript作为前端语言时界面UI的设计需求,因此,加强二进制数据的读取功能显得越发重要,幸运的是,NodeJS提供了Buffer类,该类

tyler_download的专栏 7814

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Node中Buffer 常用API解读

Buffer 概述在 ES6 引入 TypedArray 之前,JavaScript 语言没有读取或操作二进制数据流的机制。 Buffer 类被引入作为 NodeJS API 的一部分,使其可以在 TCP 流或文件系统操作等场景中处理二进制数据流。Buffer 属于 Global 对象,使用时不需引入,且 Buffer 的大小在创建时确定,无法调整。创建 Buffer在 NodeJS v6.0.0...

weixin_34200628的博客 694

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Stream和Buffer

Stream是NodeJS(也可以说是后端)中的一个必不可少的概念。 让我们操作大文件或者大传输流的时候,可以分批处理,而不用一次性把内容读取到缓冲区才开始处理。WhatStream在一个应用程序中,流是一组有序的、有起点和终点的字节数据的传输手段。Buffer用于创建一个专门存放二进制数据的缓存区1.1 StreamStream 有四种流类型,且所有的 Stream 对象都是 EventEmit

KevinChen 7122

一起读nodejs(九)----缓存类(Buffer)

本文是对nodejs0.8.9版本的api开发手册解读.nodejs网址          缓存类(Buffer)      stability:3 - Stable     纯javascript对Unicode支持不叫不错,但是对二进制数据的支持就不怎么样了,当需要处理TCP流或者文件系统时,是必须要处理八进制流(octet streams).Node有几种策略来操作,创建,销毁八进制

程序员!我当定了! 4846

如何让Claude Code白嫖Freebuff免费模型:Freebuff2API的/v1/messages兼容层接入指南

**Freebuff2API** 是一个 OpenAI 兼容的 Freebuff 代理服务器,它不仅提供标准的 OpenAI 接口,还内置了 **`/v1/messages` Claude 消息兼容层**——这正是 Claude Code 默认使用的端点。只需一条 Docker 命令,就能让 Claude Code 零成本调用 Freebuff 的免费模型,无需任何官方订阅。 本文手把手带你完成

gitblog_00397的博客 506

了解Buffer------------【node.js基础】

Buffer为global,主要操作字节。 Buffer由JavaScript与C++结合的模块。 Buffer占用内存不是有V8分配,且占用的是堆外内存。 Buffer内存由C++层面申请,JavaScript层面分配;而且分配小于8k的内存和分配大于8k的内存是有区分的。 Buffer转换的区别:Buffer转换字符串,字符串转换为Buffer;这过程如何导致乱码产生以及如...

YHJ 328

Backend-NodeJS-Golang-Interview_QA项目全景解读:一份覆盖Node.js、Golang与MongoDB的后端面试宝典

如果你正在准备后端开发岗位面试,这份名为 **Backend-NodeJS-Golang-Interview_QA** 的开源后端面试宝典值得第一时间收藏。它是一个由社区持续维护的问答型知识库,汇聚了 **Node.js、Express.js、Golang、MongoDB/Mongoose 以及数据库工程**五大方向的 120+ 道高频面试题与精炼答案,无论是刚入门的新手,还是准备跳槽的求职者,都

gitblog_00049的博客 374

NodeJS 知识点

Node 是什么? Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,Node 不是一门语言,是让 js 运行在后端的,运行时不包括 js 全集,因为在服务端中不包含 DOM 和 BOM,Node 也提供了一些新的模块,比如 http,fs等模块。 Node 解决了什么? Node 的首要目标是提供一种简单的,用于创建高性能服务器的开发工具 Web 服务器的瓶颈在于并发的用户量,对比 Java 和 Php 的实现方式 Node在处理高并发,I/O 密集场景有明.

1305

nodejs基础常识

Nodejs 是一个基于 Chrome V8 引擎的JavaScript 运行环境。cd …切换到上一级目录cd . .

lxllxl211的博客 337
上一篇: EventEmitter 源码分析与简易实现
下一篇: NodeJS 文件操作 —— fs 基本使用
Panda Shen
博客等级 码龄10年 18粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值