nodejs用途和示例
https://nodejs.org/docs/latest-v15.x/api/synopsis.html
fs、http 就不详细展开
buffer
计算机会将无论图片、视频或其他数据都转换为二进制并存储,这就是我们说的二进制数据。
(L在字符集中是76,76在计算机中的存储形式应该是01001100 )
Buffer 类被引入作为 Node.js API 的一部分,使其可以在 TCP 流或文件系统操作等场景中处理二进制数据流。(类似于缓冲区域)
Buffer一般配合Stream流使用,充当数据缓冲区
二进制数据流(streams of binary data)
实际上,巨型数据会被分割成小块(chunks)进行传输。所以,buffer的原始定义中所说的(“streams of binary data… in the context of… file system”)意思就是说二进制数据在文件系统中的传输。比如,将file1.txt的文字存储到file2.txt中。
经验:
- 一个中文默认占用三个字节
1. 创建buff
三种方式都可以创建buffer
Buffer.alloc(字节长度, 字符串)
Buffer.from(字符串)
Buffer.allocUnsafe(字节长度)
2.buffer实例方法
3.buffer静态方法
// import { Buffer } from 'buffer';
let { Buffer } = require('buffer')
// 创建长度为 10 的以零填充的缓冲区。
const buf1 = Buffer.alloc(10);
console.log(buf1)
// <Buffer 00 00 00 00 00 00 00 00 00 00>
// 创建长度为 10 的缓冲区,
// 使用值为 `1` 的字节填充。
const buf2 = Buffer.alloc(10, 1);
// 创建长度为 10 的未初始化的缓冲区。
// 这比调用 Buffer.alloc() 快,
// 但返回的缓冲区实例可能包含旧数据,
// 需要使用 fill()、write() 、
// 或其他填充缓冲区内容的函数重写。
const buf3 = Buffer.allocUnsafe(10);
// 创建包含字节 [1, 2, 3] 的缓冲区。
const buf4 = Buffer.from([1, 2, 3]);
// 创建包含字节 [1, 1, 1, 1] 的缓冲区,
// 所有条目都使用 `(value & 255)` 截断以符合范围 0–255。
const buf5 = Buffer.from([257, 257.5, -255, '1']);
// 创建包含字符串 'tést' 的 UTF-8 编码字节的缓冲区:
// [0x74, 0xc3, 0xa9, 0x73, 0x74](十六进制)
// [116, 195, 169, 115, 116](十进制)
const buf6 = Buffer.from('tést');
// 创建包含 Latin-1 字节 [0x74, 0xe9, 0x73, 0x74] 的缓冲区。
const buf7 = Buffer.from('tést', 'latin1');
console.log(buf7)
arraybuffer
Buffer 实例也是 JavaScript Uint8Array 和 TypedArray 实例。 所有 TypedArray 方法都可在 Buffer 上使用。 但是,Buffer API 和 TypedArray API 之间存在细微的不兼容。
二进制数组由三类对象组成
DataView视图:用来读写复杂类型的二进制数据。
查看链接
arraybuffer
Buffer 实例也是 JavaScript Uint8Array 和 TypedArray 实例。 所有 TypedArray 方法都可在 Buffer 上使用。 但是,Buffer API 和 TypedArray API 之间存在细微的不兼容。
二进制数组由三类对象组成:
ArrayBuffer对象:代表原始的二进制数据。(ArrayBufffer不能直接读写)
TypedArray视图:用来读写简单类型的二进制数据。
DataView视图:用来读写复杂类型的二进制数据。
就是说数据是可以通过二进制数据来描述的。
TypedArray有Int8Array、Uint8Array、Uint16Array、Float32Array等链接
let a = new ArrayBuffer(64); // 64指的是你申请二进制数据的个数
console.log(a)
// 将数据转换成二进制形式
let ms = "我是谁,<b>who are you</b>";
let ss = new ArrayBuffer(ms.length * 2);//申请ms字符串长度*2的内存空间,乘以2是因为一个字符串等于2个字节。
console.log(ss)
function str2ab(str) {
var buf = new ArrayBuffer(str.length * 2); // 每个字符占用2个字节
var bufView = new Uint8Array(buf);
for (var i = 0, strLen = str.length; i < strLen; i++) {
bufView[i] = str.charCodeAt(i);
}
return buf;
}
const b = str2ab(ss)
console.dir(b)
let { Buffer } = require('buffer')
// import { Buffer } from 'buffer';
const buf = Buffer.from([1, 2, 3, 4]);
const uint32array = new Uint32Array(buf);
console.log(uint32array);
// 打印: Uint32Array(4) [ 1, 2, 3, 4 ]
迭代器
let { Buffer } = require('buffer')
const buf2 = Buffer.from([1, 2, 3]);
for (const b of buf2) {
console.log(b);
}
crypto
crypto模块的目的是为了提供通用的加密和哈希算法。用纯JavaScript代码实现这些功能不是不可能,但速度会非常慢。Nodejs用C/C++实现这些算法后,通过cypto这个模块暴露为JavaScript接口,这样用起来方便,运行速度也快。
const crypto = require('crypto');
// MD5是一种常用的哈希算法,用于给任意数据一个“签名”。这个签名通常用一个十六进制的字符串表示
const hash = crypto.createHash('md5');
// 可任意多次调用update():
hash.update('Hello, world!');
hash.update('Hello, world!');
console.log(hash.digest('hex')); // 7e1977739c748beac0c0fd14fd26a544