node中的buffer

本文详细介绍了Buffer在Node.js中的使用,包括其发展历史、字符编码转换(GBK到UTF-8)、进制转换、Buffer的创建方法、常用方法如toString、slice、copy等。此外,还探讨了Base64编码原理,并实现了一些基本操作。通过示例代码,展示了如何处理和操作二进制数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

buffer

在这里插入图片描述

1. buffer发展

  • ASCII(127个字符,只有数字,字母)
  • GBK2312->GBK->GBK18030
  • Unicode
  • UTF-8

一个字符有 8 , gbk 中汉字由 2 个字节组成, utf-8 中汉字由 3 个字节组成

2. 进制转化

  • parseInt:任意进制转化为10进制
  • toString:任意进制转化为任意进制
//任意进制转为十进制
console.log(parseInt('111', 2)); //=>7
console.log(parseInt('17', 8)); //=>15
console.log(parseInt('1f', 16)); //=>31

//任意进制转化为任意进制
console.log((7).toString(2)); //=>111
console.log((15).toString(8)); //=>17
console.log((31).toString(16)); //=>1f

3. iconv-lite

node中不支持gbk, 将gbk转为uft-8用 iconv-lite

const iconv = require('iconv-lite');
const fs = require('fs');
const path = require('path');

function readFile(fileName) {
    let code = fs.readFileSync(path.resolve(__dirname, fileName));
    console.log(code);
    //用iconv-lite转化
    code = iconv.decode(code, 'gbk');
    console.log(code); //=>你好
}
readFile('./a.txt')

4. 定义buffer的三种方式

  • Buffer.alloc()
  • Buffer.from(’’)
  • Buffer.from([])
const b1 = Buffer.alloc(8);
const b2 = Buffer.from('张');
const b3 = Buffer.from(['张', '王', '李', '赵']);

5. buffer中常用方法

  • buf.toString()
  • buf.slice()
  • buf.copy()
  • buf.indexOf()
  • Buffer.concat()
  • Buffer.isBuffer()
5.1 buf.toString([encoding[, start[, end]]])
let buffer = Buffer.from('张三');
console.log(buffer.toString('utf-8', 0, 3)); //=>张
5.2 buf.slice([start[, end]])

buffer截取

let b1=Buffer.from('张三'); 
const b2=b1.slice(0, 3); 
console.log(b2.toString()); //=>张

5.3 buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])

buffer拷贝

const b1=Buffer.from('张三');
const b2=Buffer.alloc(6);
b1.copy(b2,0,0,3);
b1.copy(b2,3,3,6);
console.log(b2.toString());//=>张三

实现

Buffer.prototype.copy = function(target, targetStart, sourceStart, sourceEnd) {
    for (let i = sourceStart; i < sourceEnd; i++) {
        target[targetStart++] = this[i];
    }
}
5.4 Buffer.concat(list[, totalLength])

buffer拼接

const b1 = Buffer.from('张');
const b2 = Buffer.from('三');
const b3 = Buffer.concat([b1, b2]);
console.log(b3.toString()); //=>张三

实现

Buffer.concat = function(list) {
    if (list.length === 0) return list[0];
    const totalLen = list.reduce((memo, item) => memo + item.length, 0);
    const buffer = Buffer.alloc(totalLen);
    let index = 0;
    for (let i = 0; i < list.length; i++) {
        const buf = list[i];
        for (const byte of buf) {
            buffer[index++] = byte;
        }
    }
    return buffer;
}
5.5 Buffer.isBuffer

怕断是否是Buffer

const b1 = Buffer.from('张');
console.log(Buffer.isBuffer(b1)); //=>true
5.6 buf.length

字符的长度

const b1 = Buffer.from('张三');
console.log(b1.length); //=>6
5.7 buf.indexOf
const b1 = Buffer.from('张三');
console.log(b1.indexOf('三')); //=>3
5.8 实现一个split
//实现逻辑为 indexOf+slice
Buffer.prototype.split = function(sep) {
    //获取分隔符的字符长度
    const len = Buffer.from(sep).length;
    //当前位置
    let current = 0;
    //当前偏移
    let offset = 0;
    //存储数据
    const arr = [];
    while ((current = this.indexOf(sep, offset)) !== -1) {
        arr.push(this.slice(offset, current))
        offset = current + len;
    }
    //最后一段
    arr.push(this.slice(offset));
    return arr;
}

base64

  • base64编码没有加密功能
  • base64转化后的结果会比以前大1/3
  • 不是所有图片都能转化成base64

模拟过程

const b1 = Buffer.from('张'); //=>e5 bc a0
//转化为2进制
console.log((0xe5).toString(2)); //=>11100101
console.log((0xbc).toString(2)); //=>10111100
console.log((0xa0).toString(2)); //=>10100000

//base64是4*6,及将3*8->4*6
//11100101 10111100 10100000->111001 011011 110010 100000

//转化为10进制
console.log(parseInt(0b00111001)); //=>57
console.log(parseInt(0b00011011)); //=>27
console.log(parseInt(0b00110010)); //=>50
console.log(parseInt(0b00100000)); //=>32

let str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
str += str.toLowerCase();
str += '0123456789+/';

console.log(str[57] + str[27] + str[50] + str[32]); //=>5byg=>对应的就是 张
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值