当前位置:   article > 正文

1127-buffer定义及常用方法 & 进制转换 & base64转码规则

buffer base64 字节长度

buffer介绍

  • buffer是一段暂时存放输入输出数据的一段内存
  • js语言没有二进制数据,在处理tcp和文件流的时候必须要处理二进制。NODEJS提供了一个Buffer类提供对二进制数据的操作。node把二进制转换成十六进制,存入buffer。
  • bufferi里每一项都是一个十六进制,表示一个字节。
  • Buffer是一个表示固定内存分配的全局对象,是global的属性。
  • 特点:放到缓存区中的字节数要提前确定。
  • buffer好比一个多为字节元素组成的数组,每一项都是一个字节,可以有效的在js中表示二进制数据

字节

  • 单位 b
  • 1b = 8bit 1字节=8个二进制位,转换成十进制最大是255
  • 1024b = 1k 1024字节=8个位
  • 1个utf8编码的汉字 = 3个字节 = 3b

进制表示:0b表示十进制 ;0x表示16进制 ;0开头表示8进制 0377 =>255


buffer创建

  • 通过长度创建
  1. //alloc 分配。比较耗费性能,分配的都是干净的内存
  2. let buf = Buffer.alloc(5);//创建一个长度为5的干净的buffer,
  3. console.log(buf) // [00,00,00,00,00]
  4. //allocUnsafe安全分配
  5. let buf1 = Buffer.allocUnsafe(5)//创建一个长度为5,但是不干净的buffer
  6. console.log(buf1) //[03,FF,00,13,00]
  7. 复制代码
  • 通过数组创建,自动把十进制转换成16进制,存入数组。数组中必须是数字,可以是10进制、16进制 8进制,但是都不能大于255
  1. let buf = Buffer.from([17,18,19,0x11])
  2. console.log(17,18,19,0x11)//<Buffer 11 12 13 11>
  3. 复制代码
  • 字符串创建
  1. let buf = Buffer.from('欢迎光临')
  2. console.log(buf);
  3. //发现buf的长度是12,buf中存放着12个十六进制,也就是12个字节。
  4. //buffer的长度,就是字节的个数,一个汉字对应3个字节,每个字节都转换为16进制,存入到buffer中
  5. console.log(buf.length);查看buf的长度
  6. 复制代码

buffer的常用方法

实例调用
  • toString 转字符串,还可以指定编码。
  1. let buf = Buffer.from('欢迎光临');
  2. console.log(buf.toString());//欢迎光临
  3. var buf = Buffer.from('珠');
  4. console.log(buf.toString('base64')); //54+g
  5. 复制代码
  • fill 填充
  1. // fill 填充
  2. // * @param {Number|String} value (if it's string, the first char code is used) 填充内容
  3. // * @param {Number?} [offset=0] start buffer offset,不传,就从头开始
  4. // * @param {Number?} [end=this.length] end buffer offset,不传就到结尾
  5. let buf1 = Buffer.allocUnsafe(5)//创建一个长度为5,但是不干净的buffer
  6. console.log(buf1) //[03,FF,00,13,00]
  7. buf1.fill(0) 将buf全部重置为0
  8. 复制代码
  • slice 截取、浅克隆(截取的是内存)。
  1. let buf = Buffer.from([1,2,3,4]);
  2. let newBuf = buf.slice(0,1);//[01]
  3. newBuf[0] = 100; //100除以16,商6余4,所以十六进制 是64; 64=>100 16*6+4
  4. console.log(buf) <64,02,03>
  5. //通过修改新的 newBuf,旧的buf也发生了改变,slice截取的是一段内存。
  6. 复制代码
  • copy 拷贝,将一个buf拷贝到另一个buf中。要copy哪个,哪个来调用copy
  1. //param:目标buffer、目标buffer开始位置、源开始位置(可省略,省略表示从头开发copy)、源结束位置(可省略,表示copy到结尾);
  2. var buf1 = Buffer.from('欢迎');
  3. var buf2 = Buffer.from('光临');
  4. var buf = Buffer.allocUnsafe(12);//12个字节
  5. buf1.copy(buf,0) //=>buf2.copy(buf,0,0,6)
  6. buf2.copy(buf,6,0,6) // => buf2.copy(buf,6)
  7. console.log(buf)
  8. console.log(buf.toString())//欢迎光临
  9. 复制代码
Buffer类调用
  • buffer拼接 Buffer.concat([buf1,buf2],totalLength);
  1. //没传totallength,会自动计算新bug的长度;
  2. //传入的totallength已totallen为准,totallength大于总长度,那么会截取buf,降低内存消耗
  3. var buf1 = Buffer.from('欢迎');
  4. var buf2 = Buffer.from('光临');
  5. console.log(Buffer.concat([buf1, buf2]).toString()); //欢迎光临
  6. console.log(Buffer.concat([buf1, buf2],3).toString());//欢
  7. console.log(Buffer.concat([buf1, buf2],4).toString());//欢�
  8. console.log(Buffer.concat([buf1, buf2],100).toString());欢迎光临
  9. //手写concat方法
  10. Buffer.myConcat = function(list,totalLength){
  11. //判断长度,如果传递了用传的,没传自己计算总长度。
  12. if(typeof totalLength == "undefined"){
  13. totalLength = list.reduce((prev,next)=>{
  14. return prev + next.length;
  15. },0)
  16. }
  17. //通过长度创建一个buffer
  18. let B = Buffer.alloc(totalLength);
  19. //循环list,将每一项copy到这个大buffer上,buf.copy
  20. let offset = 0 ;
  21. list.forEach(buf=>{
  22. if(!Buffer.isBuffer(buf)) return new Error('not buffer');
  23. buf.copy(B,offset)
  24. offset += buf.length;
  25. })
  26. //如果长度过长,fill把空闲内容清空,或者财通slice截取有效长度
  27. return B.slice(0,offset)
  28. }
  29. 复制代码
  • 判断是不是buffer
  1. Buffer.isBuffer(buf1); // true
  2. 复制代码

js进行进制转换

  • toString(目标进制) 10->2 16->2 10->16 16->8 8->16
  1. (0xff).toString(8) // '377'
  2. (255).toString(2) // "11111111"
  3. (255).toString(16) //"ff" => 255/16 ,商15余16 所以是ff
  4. (255).toString(8) //"377" => 255/8 商31余7
  5. 31/837
  6. 从下往上所以是377
  7. 复制代码
  • parseInt(被转数,被转数的进制),16->10 2->10 8->10
  1. parseInt("0xff",16) //255 16的0次方 * f(15) + 16的1次方 *f(15)
  2. parseInt("11111111",2) //255 2的0次方*1 + 2的一次方*1 +2的2次方*1+....
  3. parseInt("377",8) //255 =>8的0次方 *7 + 8的一次方*7 + 8的二次方*3
  4. 复制代码
  • base64编码依靠的就是进制转换
  • 汉字转base64: 汉字=> 3个字节的buffer => 16->2进制 => 24bit => 4个字节 =>2->10 =>去可见编码取值
  1. 过程:
  2. var buf = Buffer.from('珠');
  3. console.log(buf.toString('base64'));
  4. //把一个汉字的24位,转换成4个字节,每个字节就6位,不足的补0;
  5. console.log(buf); //e7 8f a0
  6. //1.把16转换成2进制 toString
  7. console.log((0xe7).toString(2)); //11100111
  8. console.log((0x8f).toString(2)); //10001111
  9. console.log((0xa0).toString(2)); //10100000
  10. // 11100111 10001111 10100000
  11. // 111001 111000 111110 100000
  12. // 00111001 00111000 00111110 00100000 , 最大就是00111111,转换十进制,最大就是63,不超过64
  13. // 2.将这些纸转换成10,去可见编码中取值;
  14. //parseInt,将指定进制的数 转换成10进制
  15. console.log(parseInt('00111001',2)); //57
  16. console.log(parseInt('00111000',2)); //56
  17. console.log(parseInt('00111110',2)); //62
  18. console.log(parseInt('00100000',2)); //32
  19. //3.去可见编码中取出值为 54+g
  20. let str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  21. str +="abcdefghijklmnopqrstuvwxyz";
  22. str += "0123456789";
  23. str +='+/';
  24. console.log(str[57]+str[56]+str[62]+str[32])
  25. "珠" => 54+g
  26. 复制代码

bse64可见编码

字符串具有不变性

  1. var str1 = "欢迎光临";
  2. str1[0] = 'hello';//改变不了的 因为字符串具有不变性
  3. console.log(str1); //"欢迎光临";
  4. 复制代码
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/145158
推荐阅读
相关标签
  

闽ICP备14008679号