zoukankan      html  css  js  c++  java
  • node的buffer模块

    Buffer这块很早前就想留一篇笔记。前端JS处理buffer的场景其实并不多,虽然后来基于webGL与显卡通信的需求增加了二进制数组,但毕竟相对小众。

    Buffer的含义是,在数据传输时用内存中的一块地方临时存储Input/Output的data(原始数据)。我们处理buffer,其实就是处理二进制数据。

    在node中Buffer模块的Buffer类有好几十个api,主要的莫过于分配缓存区、读写、和一些常见操作。

    *buffer在nodejs中是全局存在的,不必require。

    *所有以new方式实例化buffer的操作在文档上都是不推荐甚至弃用的。

    -------------------分割线-------------------------------------------------

    1.实例化:

    第一种方式是new Buffer(string),在REPL模式下:

    > new Buffer('HELLO 你好');
    <Buffer 48 45 4c 4c 4f 20 e4 bd a0 e5 a5 bd>

    //默认是用utf-8转换,一个字母对应一个元素,空格是 20,一个汉字对应三个元素。

    第二种是:var buf=new Buffer(10);此时开辟了一个区间,长度为10字节。buf.length 输出为10.

    指定buffer长度后,写入的内容超出部分不会被缓存。

    第三种方式是:var buf=new Buffer([1,2,3,4]);console.log(buf)

    <Buffer 01 02 03 04> //当数组中的数值大小为256时,buffer中元素为 00 ,再增加时从01开始计算。

    2.静态方法:

     1 > Buffer
     2 { [Function: Buffer]
     3   poolSize: 8192,
     4   from: [Function],
     5   alloc: [Function],
     6   allocUnsafe: [Function],
     7   allocUnsafeSlow: [Function],
     8   isBuffer: [Function: isBuffer],
     9   compare: [Function: compare],
    10   isEncoding: [Function],
    11   concat: [Function],
    12   byteLength: [Function: byteLength] }

    3.实例方法:

    buffer[index]

    buffer.length

    buffer.write(string,offset=0,length,encoding='utf8')

    buffer.toString(encoding,start=0,end=buffer.length)

    buffer.copy(target,tStart,sStart,sEnd=buffer.length)

    buffer.slice(start,end)

    buffer.compare(other buffer)

    buffer.equals(other buffer)

    buffer.fill(value,offset,end)

    //offset表示字符串转换后写入的位置

    *buffer在初始化的是后长度已经指定。

    buffer.write方法写入时,默认从第0位开始覆盖。

    1  var buf=new Buffer('hello mukewang');
    2 buf.write('aaaaaaaaaa',6,8)

    字符串‘mukewang’会被aaaaaaaa替代,超出长度部分被抛弃。

    buffer.copy方法:

     1 > var buf1=new Buffer('this is something');
     2 undefined
     3 > buf1.length
     4 17
     5 > var buf2=new Buffer(4);
     6 undefined
     7 > buf1.copy(buf2)
     8 4
     9 > buf2.toString();
    10 'this'
    11 > buf1.copy(buf2,0,5,17)
    12 4
    13 > buf2.toString();
    14 >'is s'

    当然,这些练习其实没什么意思。。。。。

    在实际中比较有用的一种应用是格式转换:

    1 >var words='hello';
    2 >var buf=new Buffer(words);
    3 >buf.toString('base64');
    4 'aGVsbG8='
    5 
    6 > var buf2=new Buffer('aGVsbG8=','base64');
    7 > buf2.toString('utf8');
    8 'hello'

    另一个场景是图片的base64格式:

    1 fs.readFile('./1.jpg',function(err,origin_buffer){
    2     console.log(Buffer.isBuffer(origin_buffer))
    3     fs.writeFile('decode.jpg',origin_buffer,function(err){
    4         if(err){console.log(err)}
    5     })
    6 })

    这段简单的代码先读取1.jpg这张图片,然后再创建一个decode.jpg并将二进制数据写入其中。结果是在本地生成一张图片。(上面就懒得转base64了)

    如果本地保存有base64格式的图标/图片,将:

      data:image/png;base64,base64格式的buffer

    写入网页中某个元素的backgound-image:url(here)中,即可获取图片。

  • 相关阅读:
    【STM32F407开发板用户手册】第8章 STM32F407的终极调试组件Event Recorder
    【STM32F429开发板用户手册】第7章 STM32F429下载和调试方法(IAR8)
    【STM32F407开发板用户手册】第7章 STM32F407下载和调试方法(IAR8)
    【STM32F429开发板用户手册】第6章 STM32F429工程模板建立(IAR8)
    【STM32F407开发板用户手册】第6章 STM32F407工程模板建立(IAR8)
    【STM32F429开发板用户手册】第5章 STM32F429下载和调试方法(MDK5)
    【STM32F407开发板用户手册】第5章 STM32F407下载和调试方法(MDK5)
    基于STM32H7,F407,F429的ThreadX内核程序模板,含GCC,MDK和IAR三个版本(2020-06-08)
    【STM32F429开发板用户手册】第4章 STM32F429工程模板建立(MDK5)
    【STM32F407开发板用户手册】第4章 STM32F407工程模板建立(MDK5)
  • 原文地址:https://www.cnblogs.com/alan2kat/p/7428879.html
Copyright © 2011-2022 走看看