前言
默认文件读取操作, 读取出来的都是buffer
内存的表示方式就是Buffer ,内存二进制的 、Buffer十六进制的
1 | // node.md |
1 | let fs = require('fs'); |
进制转化
- 将任意进制转化成任意进制:
- xxx.toString(‘xxx’); 只是值会变成字符串
- toString(‘utf8’ || ‘base64’); 不支持gbk
- 将任意进制转化成十进制
- parseInt(‘0xff’,16); // 十六进制 => 十进制
- 示例
0.1 + 0.2 != 0.3
1 | // 我们需要将值存到内存中 保存的时候存储的是二进制 |
- 进制转化 小数 *2 取整法
1 | // 0.1如何变成二进制 如下: |
整数 进制转化 基于编码
ASCII(美国) 默认 就一个字节来表示是一个字母或者符号
1个字节 有8个bit 最大是 8个1 => 10进制 255
默认 字母 常见符号 \r \n
gbk 用两个字节来表示中文
utf-8 用两个字节来表示中文将10进制 转化成其他进制 0xff 0b 0o
1 | console.log(100..toString(16)); // 64 值变成了字符串 |
- 十六进制转化成十进制
1 | console.log((0xff).toString(10)); // 255 |
- 十六进制转化成十进制
1 | console.log(parseInt('0xff',16), typeof parseInt('0xff',16)); |
- base64
二进制的值不能超过64 (核心就是进制的转化)
1 | // 在浏览器header中,任意的url中都可以采用base64,前端实现文件预览 (fileReadReader 读出来也是base64) |
base64 转化后取特定的字符串取值
1 | let str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; |
编码问题
iconv-lite
1 | // 现在新建一个test.md gbk格式的文件 |
Buffer
把二进制表现成了10进制 可以和字符串进行转化
1) Buffer的声明方式
Buffer代表的是内存 一旦声明就不能扩展 数组的话可以扩展
- 固定大小
1 | let buf = Buffer.alloc(5);// 分配5个 出来的结果很像数组 |
常用的赋值方式是第一种和最后一种
2) Buffer的常见方法
和数组类似
2.1) slice
1 | let arr = [[1,2,3],4,5]; |
Buffer存放的都是内存地址,如果截取了某一段,改变的时候也是更改了这个内存地址
2.2)判断Buffer类型
1 | console.log(Buffer.isBuffer(buffer)); //true 是不是Buffer |
2.3) Buffer不能扩展大小
copy
1 | let buffer1 = Buffer.from("珠"); |
- 写一下这个copy 的原理
1 | Buffer.prototype.copy = function(targetBuffer, targetStart, sourceStart = 0, sourceEnd = this.length){ |
2.4) concat拼接
1 | let buffer1 = Buffer.from("珠"); |
- 写下concat的原理
1 | Buffer.concat = function (list, length = list.reduce( (a,b)=>a+b.length,0)){ |
isBuffer 、length字节数 、concat 、toString()|toString(‘base64’) 、slice 、fill
Buffer场景:文件读写 、数据读写
3) 扩展Buffer的方法
1 | let buffer = Buffer.from('加菲加菲加菲'); |
- 行读取器
文本 希望每拿到一行就打印
1 | let buffer = Buffer.from(`加菲加菲加菲加菲 |
现在希望能够通过 buffer.split(‘\n’) 就能把上面的数据分成三段取出
1 | let buffer = Buffer.from(`加菲加菲加菲加菲 |